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

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

~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) для многострочного поиска

  • Замените обратную косую черту sed
  • Как получить часть строк из всех .txt-файлов в каталоге?
  • Что означает это регулярное выражение?
  • sed, чтобы удалить все строки с рисунком и добавить строки в конце
  • Как удалить n количество строк из файла с помощью команды sed?
  • эффект * в регулярном выражении
  • Как связывать линии между шаблоном начала и конца?
  • Извлечение с помощью grep / sed первого шаблона, а затем второго шаблона, который имел некоторые строки до и связанные с первым
  • Как пропустить файл в sed, если он содержит регулярное выражение?
  • Как извлечь определенные поля из строк с помощью команд оболочки?
  • Вставьте новую строку перед каждой строкой, соответствующей шаблону, если предыдущая строка уже не указана
  • Выровнять шестнадцатеричный текстовый файл по 9 байт каждой строки
  • Interesting Posts

    Запустите Ubuntu 10.04 LTS с помощью Apache2 SSL с парольной фразой

    Как использовать параметр `~ / .ssh / config` для каждого сервера с помощью` rsync`

    Где rsyslog поддерживает объект local0?

    Сценарий Bash для вставки информации после каждой строки блока данных

    Определить пользовательскую оболочку входа в очередь

    Не удается заставить TFTP-сервер работать с Ubuntu с помощью xinetd

    Совместить отсутствующие значения в текстовых файлах

    Изменение поворота экрана в GNOME / Wayland

    Распространяется ли дисковое пространство при установке ISO?

    Какой пользователь выполняет команды, определенные в /etc/rc.local?

    Обновляется ли dnsmasq при работе в качестве сервера dhcp?

    8-битный вход в гном-терминал

    Как установить openssh-сервер на openSUSE?

    Как я могу запускать программу в качестве другого пользователя во всех отношениях?

    Возможно ли настроить VPN таким образом, чтобы я отключился от Интернета, если он снизился?

    Linux и Unix - лучшая ОС в мире.