Grep invertiert Übereinstimmung mit Kontext

Grep invertiert Übereinstimmung mit Kontext

Ich versuche, eine Datei mit invertierter Übereinstimmung zu greppen, aber es stimmt auch nicht jede Zeile überein, die direkt nach den übereinstimmenden Zeilen auftritt.

Ich habe also den folgenden Inhalt in einer Datei namens testing_grep:

aaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbb
cccccccccccccccccc
dddddddddddddddddd
llllllllllllllllll
dddddddddddddddddd
llllllllllllllllll
fffffffffffffffff
fffffffffffffffff

Ich möchte also alle Zeilen außer denen abgleichen, die Folgendes enthalten, dsowie die nächste Zeile, die auf eine solche Übereinstimmung folgt. Daher habe ich den folgenden grepBefehl:

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

Allerdings werden weiterhin alle Zeilen ausgegeben, obwohl ich nur die folgende Ausgabe benötige:

aaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbb
cccccccccccccccccc
fffffffffffffffff
fffffffffffffffff

Vielen Dank für jede Hilfe.

Antwort1

Versuchen Sie dies mit GNU sed:

Suche ( ) im Musterraum (aktuelle Zeile) //nach einer Zeile, die enthält d. Nur für diese Zeilen füge die nächste Eingabezeile an den Musterraum an ( N) und lösche den Musterraum ( d).

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

Ausgabe:

aaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbb
cccccccccccccccccc
ffffffffffffffff
ffffffffffffffff

Antwort2

Cyrus hat Ihnen bereits die perfekte Antwort gegeben, aber wenn Sie es mit grep machen wollen (was komplizierter ist)

Sie greppen die Zeilen, die Sie nicht wollen, und legen sie in einer Datei ab:

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

Der Inhalt von otherfile.txt wird sein: dddddddddddddddddd llllllllllllllllll dddddddddddddddddd llllllllllllllllll

Anschließend verwenden Sie den Befehl „diff“, um die Differenz zu ermitteln:

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

verwandte Informationen