Измененная входная выборка для включения блока startStr ... endStr
без bbb
перед совпадающим блоком
$ cat ip.txt
startStr
foo
bar
endStr
fff
baz
startStr
aaa
bbb
ccc
endStr
xxx
yyy
startStr
ddd
endStr
ddd
bbb
awk
solution
awk '/startStr/{f=1; m=0; buf = $0; next}
/bbb/ && f{m=1}
f{buf = buf ORS $0}
/endStr/ && f{f=0; if(m==1)print buf}
' ip.txt
/ startStr / {f = 1 ; m = 0; buf = 0 $; next}
установить флаг, чтобы указать начало блока, очистить совпадение, инициализировать буфер и перейти к следующей строке / bbb / && f {m = 1}
, если строка содержит bbb
, установить матч. f
используется, чтобы избежать сопоставления bbb
вне startStr ... endStr
f {buf = buf ORS $ 0}
, пока установлен флаг, накапливать входные строки / endStr / && f {f = 0; if (m == 1) print buf}
в конце блока, буфер печати, если совпадение было найдено
как однострочное:
$ awk '/startStr/{f=1; m=0; buf = $0; next} /bbb/ && f{m=1} f{buf = buf ORS $0} /endStr/ && f{f=0; if(m==1)print buf}' ip.txt
startStr
aaa
bbb
ccc
endStr
Более простое решение perl
, прихлебывая весь входной файл - предполагает, что нет таких блоков, как startStr ... startStr ... endStr
(т.е. нет endStr для первого startStr)
$ perl -0777 -ne '(@m) = /startStr.*?endStr\n/gs; print grep { /bbb/ } @m' ip.txt
startStr
aaa
bbb
ccc
endStr