2013-08-04 4 views
5

Я хотел бы объединить несколько строк, выполнить их регулярное выражение и распечатать их. Я попытался сделать это с помощью sed.Regex with sed, поиск по нескольким строкам

А именно, я использовал:

cat add | sed -rn '/FIRST_LINE_REGEX/,/LAST_LINE_REGEX/s/SOME_REGEX/&/p' 

Он печатает только те строки, которые соответствуют SOME_REGEX в то время как я ожидаю, что это сцепить строки из диапазона между first_line и LAST_LINE и печатями конкатенации, если он соответствует SOME_REGEX.

ответ

9

При использовании '/FIRST_LINE_REGEX/,/LAST_LINE_REGEX/' каждая строка по-прежнему обрабатывается отдельно, чтобы объединить строки, вам необходимо использовать пространство удержания или команду N, чтобы добавить следующую строку в пространство шаблона. Вот один вариант:

cat add | sed -rn '/FIRST_LINE_REGEX/{:a;N;/LAST_LINE_REGEX/{/SOME_REGEX/p;d};ba}' 

Комментариев Версия:

cat add | sed -rn '/FIRST_LINE_REGEX/ { # if line matches /FIRST_LINE_REGEX/ 
    :a          # create label a 
    N          # read next line into pattern space 
    /LAST_LINE_REGEX/ {      # if line matches /LAST_LINE_REGEX/ 
    /SOME_REGEX/p       # print if line matches /SOME_REGEX/ 
    d          # return to start 
    } 
    ba          # return to label a 
}' 
+0

Это именно то, что я хотел, спасибо. –

0

sed -n '/FIRST_LINE_REGEX/,/LAST_LINE_REGEX/p' add | sed -n '/FIRST_LINE_REGEX/ b check; H; $ b check; b; :check; x; /SOME_REGEX/p'

Мотивация второй части трубы идет отсюда: https://stackoverflow.com/a/6287105/992834

Edit: Измененный когда SOME_REGEX является между.

+0

Это все равно будет печатать только строки, содержащие 'SOME_REGEX', я думаю, что OP хочет напечатать все блоки, начинающиеся с' FIRST_LINE_REGEX', заканчивающиеся на 'LAST_LINE_REGEX' и содержащие' SOME_REGEX'. –

+0

Проблема заключается в том, что первый раздел передает линии в виде строк, и они все еще обрабатываются отдельно. Я бы хотел, чтобы второй раздел распечатывал весь контент между FIRST_LINE и SECOND_LINE, если контент соответствует SOME_REGEX –

+0

Упор на «если он соответствует SOME_REGEX». должным образом отмечен –

Смежные вопросы