Ich benutze diese
cat foo.txt | sed '/bar/d'
um Zeilen, die die Zeichenkette "bar" enthalten, aus der Datei zu entfernen.
Ich würde jedoch gerne diese Zeilen und die Zeile direkt danach entfernen. Vorzugsweise mit sed
, awk
oder einem anderen Tool, das in MinGW32 verfügbar ist.
Es ist eine Art Umkehrung dessen, was ich in grep
mit -A
und -B
erreichen kann, um übereinstimmende Zeilen sowie Zeilen vor/nach der übereinstimmenden Zeile zu drucken.
Gibt es eine einfache Möglichkeit, dies zu erreichen?
Wenn "bar" in aufeinanderfolgenden Zeilen vorkommen kann, können Sie dies tun:
awk '/bar/{n=2}; n {n--; next}; 1' < infile > outfile
Dies kann angepasst werden, um mehr als 2 Zeilen zu löschen, indem man die obige 2 durch die Anzahl der zu löschenden Zeilen einschließlich der passenden Zeile ersetzt.
Wenn nicht, ist es leicht in sed
mit @MichaelRollins' Lösung oder zu machen:
sed '/bar/,/^/d' < infile > outfile
Ich beherrsche sed nicht fließend, aber in awk ist es leicht zu machen:
awk '/bar/{getline;next} 1' foo.txt
Das awk-Skript lautet: für eine Zeile, die bar enthält, hole die nächste Zeile (getline), dann überspringe die gesamte weitere Verarbeitung (next). Das Muster 1 am Ende gibt die restlichen Zeilen aus.
Wie im Kommentar erwähnt, funktionierte die obige Lösung nicht mit aufeinanderfolgenden "bar". Hier ist eine überarbeitete Lösung, die dies berücksichtigt:
awk '/bar/ {while (/bar/ && getline>0) ; next} 1' foo.txt
Wir lesen jetzt weiter, um alle /bar/ Zeilen zu überspringen.
Um dies zu erreichen, müssen Sie die Skriptfunktionen von sed'nutzen.
$ sed -e '/bar/ {
$!N
d
}' sample1.txt
Beispielhafte Daten:
$ cat sample1.txt
foo
bar
biz
baz
buz
Der Befehl "N" fügt die nächste Eingabezeile an den Musterbereich an. Zusammen mit der Zeile aus dem Mustervergleich (/bar/) sind dies die Zeilen, die Sie löschen möchten. Sie können dann ganz normal mit dem Befehl "d" löschen.