Регулярное выражение, сопоставляющее несколько строк с 3 значениями

Регулярное выражение, сопоставляющее несколько строк с 3 значениями

Я видел несколько примеров этого, но я не могу заставить это работать в моей конкретной ситуации. Допустим, есть файл ниже.

foo
line 1
line 2
line 3
bar
junk
junk
foo
line 1
line 2
baz
line 4
bar

Я пытаюсь перехватить все, что находится между «foo» и «bar», если оно содержит «baz» в одну строку.

Все, что я нашел до сих пор, отлично подходит для поиска всего между foo и bar, но ничто не подходит для поиска только того, что содержит baz.

Редактировать: Мне подходит следующее:

sed -n '/foo/{:a;N;/bar/!ba; /baz/p}' input.txt

решение1

awk '
/foo/ { save=1 }
/baz/ { p=1 }
/bar/ { if (p) { print out ORS $0; } p=0; save=0; out="" }
{ if (save) { if (out) { out = out ORS $0 } else { out = $0 } } }
' input

Начинаем сохранять строки, если видим /foo/; решаем, что их стоит напечатать, если видим /baz/, и как только видим /bar/, печатаем сохраненные строки, если видим /baz/.

Я не могу найти более разумного способа предотвратить появление пустой строки (ORS) в начале переменной «out» без ее ручной проверки (как я это делаю).

Связанный контент