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).