Dies könnte für Sie arbeiten (GNU sed):
echo -e "a\nyyyy\nxxxx\nzzzz\nb" | sed 'N;/^xxxx/M{/^xxxx/d;$!N;d};P;D'
a
b
Dieses ein Fenster von zwei Zeilen in dem Musterraum hält und Wenn der erforderliche Regexp in der ersten oder zweiten Zeile gefunden wird, liest die folgende Zeile und löscht dann alle drei Zeilen. Die Randfälle sind, wenn der Regexp entweder in der ersten oder in der letzten Zeile gefunden wird, wenn keine Zeile vorher/nachher vorhanden ist. In diesen Fällen können nur zwei Zeilen gelöscht werden.
Übrigens hat diese Lösung möglicherweise einen Fehler in GNU sed entdeckt. Das M
-Flag einer Adresse ermöglicht die Metazeichen ^
und $
als Null Länge Markierungen in einer Regexp für den Anfang und das Ende der Zeile in mehrzeiligen Zeichenfolgen verwendet werden. Die leere Adresse //
verwendet eine zuvor angegebene Adresse. Sollte diese Adresse eine sein, die ein mehrzeiliges Flag enthält? Derzeit scheint es, die Flagge zu schließen, auch wenn es nicht das heißt
angegeben
sed 'N;/^xxxx/M{/^xxxx/d;$!N;d};P;D' file
eine andere erzeugt (korrekt) führen zu:
sed 'N;/^xxxx/M{//d;$!N;d};P;D' file
wenn xxxx
auf der zweiten Zeile einer Datei erscheint.
Eine weitere Erklärung der 'x' Befehl, der den Musterbereich mit dem Haltepuffer "eXchanges": http://www.grymoire.com/Unix/Sed.html#uh-53 –
Ich kann das obige Skript nicht ausführen. es sagt sed: FUNCTION/^ Muster/{n n x d} x 1d p $ {x p} kann nicht geparst werden nicht sicher warum? –