Фильтр текста между двумя шаблонами с предшествующими n строками - PullRequest
1 голос
/ 05 февраля 2011

Предположим, что у нас есть такой файл:

l1 abcdefgh
l2 abcde
l3 some line i want to retrieve
l4 another line i want to retrieve
l5 matching pattern
l6 abc
l7 abcdef
l8 unmatching pattern
l9 blah blah

Я хочу получить следующий вывод:

l3 some line i want to retrieve
l4 another line i want to retrieve
l5 matching pattern
l6 abc
l7 abcdef

Итак, я хочу вывести две строки до первого совпадения шаблона, совпадающей строки и всех строк, пока я не нажму «Неподходящий шаблон». Конечно, может быть несколько текстовых диапазонов для извлечения.

Какой самый простой способ добиться этого? Какие инструменты я должен использовать? О чем гуглить? Изучение аук на основе невозможно в данный момент.

Ответы [ 3 ]

2 голосов
/ 05 февраля 2011
awk '/pattern/{print p"\n"q"\n"$0;f=1;next} {p=q;q=$0} f{s=s"\n"$0; if ($0~/unmatching/) { print s;exit} }' file
2 голосов
/ 05 февраля 2011

В awk

{ a[i++ % 3 ]=$0} 
/ matching pattern/ {print a[(i-3)%3];print a[(i-2)%3];i=0}
/matching pattern/,/unmatching pattern/ {if($0 !~ /unmatching pattern/) print }

Working here

1 голос
/ 06 февраля 2011

В седе:

sed -n '1N;N;/pattern/{N;N;p;s/.*//;N;N;};$!D' filename
...