Coincidencia de expresiones regulares en varias líneas con 3 valores

Coincidencia de expresiones regulares en varias líneas con 3 valores

He visto algunos ejemplos de esto, pero parece que no puedo hacerlo funcionar en mi situación particular. Digamos que existe el siguiente archivo.

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

Estoy tratando de capturar todo entre 'foo' y 'bar' siempre que contenga 'baz' con una sola línea.

Todo lo que he encontrado hasta ahora es excelente para encontrar todo entre foo y bar, pero nada parece ser bueno para encontrarlo solo si contiene baz.

Editar: Lo siguiente funciona para mí:

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

Respuesta1

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

Comience a guardar líneas si vemos un /foo/; decide que vale la pena imprimirlas si vemos un /baz/, y una vez que vemos un /bar/, imprimimos las líneas guardadas si vemos un /baz/.

No puedo encontrar una forma más inteligente de evitar que aparezca una línea en blanco (ORS) al principio de la variable "salida" sin probarla manualmente (como hago yo).

información relacionada