apaga as linhas antes da partida, exceto a correspondência acima da stdout

1

Procurando usar qualquer comando para produzir o resultado a seguir. Editado para maior clareza. Estou tentando remover qualquer ^ abc que não seja uma linha antes de ^ xyz.

stdout:

abc def
abc ghi
abc jkl
xyz mno
xyz pqr
abc def
abc ghi
abc jkl
xyz mno
xyz pqr

resultado desejado:

abc jkl
xyz mno
xyz pqr
abc jkl
xyz mno
xyz pqr
    
por Jer 26.06.2018 / 01:36

2 respostas

1

Você pode manter um buffer de duas linhas (usando um N D loop) e imprimir a primeira linha antes de excluí-lo somente se houver um xyz no buffer:

$ cat stdout | sed ':a; $!N; /xyz/P; D; ba'
abc jkl
xyz mno
xyz pqr
abc jkl
xyz mno
xyz pqr
    
por 26.06.2018 / 03:00
0

Aqui está uma awk one-liner.

awk '/^abc/ {prev = $0; prevabc = "true"}; /^xyz/ {if (prevabc == "true") {print prev; prevabc = "false" } ; print}' file.txt

Explicação

  • /^abc/ {prev = $0; prevabc = "true"}; : Se a linha começar com abc , não imprima, mas armazene o valor da linha na variável prev e indique que essa linha começou com abc armazenando true em variável prevabc .
  • /^xyz/ {if (prevabc == "true") {print prev; prevabc = "false" } ; print} : Se a linha começar com xyz , faça o seguinte.
    • if (prevabc == "true") {print prev; prevabc = "false" } : Se a linha anterior começou com abc (porque prevabc == "true" ), imprima a linha anterior prev e redefina prevabc para false .
    • print : como essa linha começou com xyz , imprima esta linha também.
por 26.06.2018 / 02:58

Tags