Correspondência de regex em várias linhas com 3 valores [duplicado]

0

Eu vi alguns exemplos disso, mas não consigo fazer isso funcionar na minha situação particular. Vamos dizer que existe 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' contanto que contenha 'baz' com um forro único.

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

Editar: o abaixo funciona para mim:

sed -n '/foo/{:a;N;/bar/!ba; /baz/p}' input.txt
    
por James Lacy 25.05.2017 / 21:43

1 resposta

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

Comece salvando linhas se virmos um / foo /; decida que valem a pena imprimir se virmos um / baz /, e uma vez que vermos um / bar /, imprimamos as linhas salvas se vimos um / baz /.

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

    
por 25.05.2017 / 22:32