Назад | Перейти на главную страницу

как получить текст с помощью sed?

Я хочу взять текст между tok98 и 5678 и выгрузить его в файл.

если tok98 и 5678 были на одной линии, я могу использовать это

sed -n 's/.*\(tok98\)\(.*\)\(5678\).*/\2/p' testfile.txt > text.dmp

но когда токены расположены вертикально, он не работает, как я могу переписать этот sed, чтобы он работал здесь

$ cat testfile.txt
do with > 9
tok98
  fdf  df s df sd f sd v
  dvsdv  dvf sd vs vs dv  sdfsd

    2323 2323  232 {}   
   sfdf sd  f s df s df  sf 
5678
no way = true + 50

$

Вы можете использовать / START /, / STOP / диапазоны шаблонов в sed

sed -n '/tok98/,/5678/p' file

/ START / и / STOP / тоже могут быть RE

sed -n '/^tok98/,/^5678/p' file

будет печатать между строками, начиная tok98 и 5678 и не будет запускаться или останавливаться, если строки не начинаются с этих строк.

Если вы хотите исключить / START / и / STOP /, это должно работать

sed -n '/^tok98/,/^5678/ {/^tok98/b;/^5678/b;p}' file

sed по умолчанию не обрабатывает несколько строк, но это можно решить с помощью трюка вроде:

$ cat testfile.txt | tr '\n' ',' | sed -n 's/.*\(tok98\)\(.*\)\(5678\).*/\2/p' | tr ',' '\n' > text.dmp

Вам просто нужно преобразовать символы новой строки \n какому-то другому персонажу, например , а затем конвертируйте их обратно в \ n, когда закончите с sed. Вы должны убедиться, что во входном файле нет запятой.