Grep inverte correspondência com contexto

Grep inverte correspondência com contexto

Estou tentando fazer grep em um arquivo com correspondência invertida, mas também não corresponde a todas as linhas que ocorrem logo após as linhas correspondentes.

Portanto, tenho o seguinte conteúdo em um arquivo chamado testing_grep:

aaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbb
cccccccccccccccccc
dddddddddddddddddd
llllllllllllllllll
dddddddddddddddddd
llllllllllllllllll
fffffffffffffffff
fffffffffffffffff

Então, quero combinar todas as linhas, exceto aquelas que contêm de a próxima linha após essa correspondência, então tenho o seguinte grepcomando:

 grep -v "d" -A 1 testing_grep.txt 

No entanto, ainda recebo todas as linhas sendo emitidas, enquanto tudo que preciso é a seguinte saída:

aaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbb
cccccccccccccccccc
fffffffffffffffff
fffffffffffffffff

Obrigado por qualquer ajuda.

Responder1

Tente isto com GNU sed:

No espaço padrão (linha atual) procure ( //) uma linha contendo d. Somente para essas linhas anexe a próxima linha de entrada no espaço padrão ( N) e exclua o espaço padrão ( d).

sed '/d/{N;d;}' testing_grep.txt

Saída:

aaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbb
bbbbbbbbbbbbbbb
ccccccccccccccccc
affffffffffffff
affffffffffffff

Responder2

Cyrus já deu a resposta perfeita, mas se você quiser fazer isso com grep (que é mais complicado)

você grep as linhas que não deseja e as coloca em um arquivo:

grep 'd' -A 1 testing_grep.txt > otherfile.txt

O conteúdo de otherfile.txt será: dddddddddddddddddd llllllllllllllllll dddddddddddddddddd llllllllllllllllll

Então você usa o comando diff para obter a diferença:

diff testing_grep.txt otherfile.txt | grep '^[<>]'

informação relacionada