Ich muss eine Datei nach einer Zeichenfolge durchsuchen, alle Zeilen entfernen, die die Zeichenfolge enthalten, und auch die beiden Zeilen entfernen, die auf eine Zeile folgen, die die Zeichenfolge enthält. Ich hatte gehofft, dass ich das mit so etwas erreichen könnte ...
%Vor%... aber das hat leider nicht funktioniert. Gibt es ein einfaches Ich kann dies mit Grep oder einem anderen Shell-Befehl tun?
Das Folgende funktioniert sowohl mit GNU sed als auch mit OS X.
%Vor%two
Sie können dies mit awk
tun, wie in der folgenden Abschrift:
Es startet grundsätzlich einen Zähler von Zeilen, die weggeworfen werden (3), wenn die Zeichenfolge two
in einer Zeile gefunden wird. Es wirft dann diese Zeilen weg, bis der Überspringungszähler null erreicht. Jede Zeile, die nicht zum Überspringen markiert ist, wird gedruckt.
Mit GNU sed:
%Vor% Dies verwendet die Syntax mit zwei Adressen ( addr1,addr2
), um Zeilen mit dem Wort zwei ( /two/
) plus den zwei Zeilen nach ( +2
) abzugleichen. Der Befehl d
löscht diese Zeilen.
Hier ist ein Weg, es mit Perl zu machen:
%Vor% Die -n
ist eine implizite Schleife über die Eingabe. Wenn Sie /two/
übereinstimmen, lesen Sie die nächsten zwei Zeilen, andernfalls drucken Sie die Zeile, in der Sie sich gerade befinden.
Das Problem ist jedoch, dass Sie, wenn Sie die dritte oder vierte Zeile mit / zwei / übereinstimmen hätten, immer noch die gleiche Ausgabe erhalten würden. @ paxdiablos Lösung ist vollständiger. Aber meine ist mehr Q & amp; D.