Correspondência de Regex em várias linhas com 3 valores

Correspondência de Regex em várias linhas com 3 valores

Já vi alguns exemplos disso, mas não consigo fazê-lo funcionar na minha situação específica. Digamos que exista o arquivo abaixo.

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

Estou tentando capturar tudo entre 'foo' e 'bar', desde que contenha 'baz' com um liner.

Tudo o que encontrei até agora é ótimo para encontrar tudo entre foo e bar, mas nada parece ser bom para encontrar apenas se contiver baz.

Editar: O abaixo funciona para mim:

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

Responder1

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

Comece a salvar linhas se virmos um /foo/; decida que vale a pena imprimi-las se virmos um /baz/, e quando virmos um /bar/, imprima as linhas salvas se virmos um /baz/.

Não consigo encontrar uma maneira mais inteligente de evitar que uma linha em branco (ORS) apareça no início da variável "out" sem testá-la manualmente (como eu).

informação relacionada