Wie entferne ich mehrere Zeilen pro Vorkommen in einer Datei?

10

Angenommen, ich habe diese 857835-Zeilendatei, die Folgendes enthält:

a1
rubbish1
rubbish2
rubbish3
rubbish4
a1
rubbish5
rubbish6
rubbish7
rubbish8

Und ich möchte alle Vorkommen von a1und der nächsten Zeile ( rubbish1und rubbish5in diesem Beispiel) entfernen . Wie mache ich es?

Ich habe erfolglos versucht grep 'a1' -v -A1, und meine Fähigkeiten sind nicht wirklich großartig:}

Mein Google-Fu konnte mir diesmal nicht helfen, jemand bitte helfen!

Rayfoo
quelle

Antworten:

15

Versuchen:

sed -e '/^a1$/,+1d' "filename"

Dies bedeutet von / ^ a1 $ / bis zur nächsten Zeile löschen

^ Und $ stellen sicher, dass Sie mit der gesamten Zeile übereinstimmen, sodass eine versteckte a1 nicht übereinstimmt.

asoundmove
quelle
6
Vielleicht möchten ^und $in diesem Spiel, passende ganze Zeilen zu erzwingen.
Jander
@ Jander: Sicher, korrigiert
Asoundmove
12

Folgendes funktioniert bei Nicht-GNU sed(die ,+1Adressensyntax ist eine GNU-Erweiterung):

sed -e '/^a1$/,/^/d' my_file >my_filtered_file

"Beginnend mit einer Zeile, die genau 'a1' lautet, und endend mit der nächsten Zeile, für die der Zeilenanfang existiert (dh die nächste Zeile), löschen Sie."

Es ist jedoch viel weniger erweiterbar als die Antwort von @ asoundmove, da das Löschen einer anderen Anzahl von Zeilen ein völlig anderes Skript erfordern würde.

Jander
quelle