как извлечь часть текста из файла между согласованными условиями

У меня есть файл, как показано ниже.

~PAR1~ This is Par1 line 1 This is Par1 line 2 Par Finished ~PAR2~ This is Par2 line 1 This is Par2 line 2 Par Finished 

Если я пройду PAR1 , я должен получить все строки между PAR1 и Par Finished . Как я могу его получить? Я искал awk и sed и не мог найти никаких вариантов.

3 Solutions collect form web for “как извлечь часть текста из файла между согласованными условиями”

Если вам нужна строка заголовка и нижнего колонтитула, то это довольно просто с sed eg

 sed -n "/^~PAR1~$/,/Par Finished/p" 

Это простое использование с переменной

 START=PAR1 sed -n "/^~$START~$/,/Par Finished/p" 

Мы также можем сделать последнюю строку переменной

 START=PAR1 END="Par Finished" sed -n "/^~$START~$/,/$END/p" 

Результат выглядит так:

 ~PAR1~ This is Par1 line 1 This is Par1 line 2 Par Finished 

Теперь, если вам не нужны строки начала / конца, и вы не хотите пустую строку, это немного сложнее.

Могут быть лучшие способы, но это работает для меня:

 sed -n "/^~$START~$/,/$END/ { /^~$START~$/d ; /$END/d ; /^$/d ; p }" 

Результатом этого является

 This is Par1 line 1 This is Par1 line 2 

Вы можете использовать линию Par Finished (с необязательными конечными пустыми строками) в качестве разделителя записей (а затем заменить ее для завершения записи)

 awk -vRS='\nPar Finished\n*' -vp='PAR1' '$0 ~ p {print $0,"\nPar Finished"}' parfile ~PAR1~ This is Par1 line 1 This is Par1 line 2 Par Finished 

Если у вас есть GNU awk, вы можете восстановить разделитель записи со специальной переменной RT (если вы захотите удалить лишние строки,

 gawk -vRS='\nPar Finished\n*' -vp='PAR1' '$0 ~ p {sub("\n*$", "", RT); print $0,RT}' parfile ~PAR1~ This is Par1 line 1 This is Par1 line 2 Par Finished 

Конечно, если вам не нужно передавать переменную Par1 вы используете простой диапазон регулярных выражений

 awk '/PAR1/,/Par Finished/' parfile ~PAR1~ This is Par1 line 1 This is Par1 line 2 Par Finished 

С grep и pcre для достаточно малого ввода файлов

 $ s="PAR1" $ grep -oPz "(?s)[^\n]*${s}.*?\n.*?Par Finished.*?\n" ip.txt ~PAR1~ This is Par1 line 1 This is Par1 line 2 Par Finished 

Чтобы получить линии между шаблоном:

 $ grep -oPz "(? s) $ {s}. *? \ n \ K. *? (? = Par Finished)" ip.txt 
 Это строка Par1 1
 Это Par1 строка 2

Изменение переменной PAR2

 $ s = "PAR2"
 $ grep -oPz "(? s) $ {s}. *? \ n \ K. *? (? = Par Finished)" ip.txt 
 Это строка Par2 1
 Это Par2 строка 2

Ссылка: Regex (grep) для многострочного поиска

  • поместите вкладку перед каждой выходной строкой на AIX / ksh
  • Самый быстрый и самый основной способ заменить «\ r \ n» на «\ n» в файле?
  • Замена нескольких пустых строк одной пустой строкой в ​​vim / sed
  • grep awk или sed CSV Row, содержащий определенную часть веб-адреса
  • файл поиска для строки (взятый из файла), затем замените любой экземпляр другой строки, которая попадает в первое совпадение
  • Заменить «o» на «0» в большом списке слов и сохранить исходное слово?
  • grep - удаление текста после токена разделителя
  • Заменить часть текстового файла с помощью скрипта bash
  • sed - как (не) совпадать с несогласованными скобками
  • Идентификаторы соответствия и исходный исходный файл
  • Curl url txt file, но grep каждый URL отдельно от одного файла
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.