Ich muss ein bestimmtes Muster in einer Datei finden und gleichzeitig 5 Zeilen darüber und 4 Zeilen darunter löschen. Ich habe herausgefunden, dass die obige Zeile die Zeile mit dem Muster und vier Zeilen darunter entfernt.
%Vor%Im sed-Handbuch wurde angegeben, dass ~ für die Linien steht, auf die das Muster folgt. Aber als ich es versuchte, waren es die Zeilen, die dem Muster folgten, die gelöscht wurden.
Also, wie lösche ich 5 Zeilen oberhalb und 4 Zeilen unterhalb einer Zeile, die das Muster gleichzeitig enthält?
Eine Lösung mit awk
:
Aktualisierung:
Dies ist das Skript erklärt:
lines
mit rotatorischen Indizes (NR% 5; NR ist die Datensatznummer; in diesem Fall Zeilen). ~
~ "XXXX
; awk
ist der aktuelle Datensatz: in diesem Fall eine Zeile; awk
ist der Erweiterte reguläre Ausdruck Vergleichsoperator) , Setze ich die Anzahl der gelesenen Zeilen zurück und beachte, dass ich 5 Zeilen löschen muss (einschließlich der aktuellen Zeile). Meine ursprüngliche Version des Skripts war die folgende, aber ich habe es am Ende auf die obige Version optimiert:
%Vor% sed
ist ein großartiges Werkzeug! Ich empfehle dringend, dass Sie ein Tutorial im Netz finden und es lesen. Eine wichtige Sache: %code% arbeitet mit Erweiterte reguläre Ausdrücke ( ERE ). Ihre Syntax unterscheidet sich ein wenig von Regulärer Standardausdruck ( RE ), die in %code% verwendet wird, aber alles, was mit RE getan werden kann, kann mit ERE erledigt werden.
Die Idee ist, 5 Zeilen zu lesen, ohne sie zu drucken. Wenn Sie das Muster finden, löschen Sie die unbedruckten Linien und die 4 Linien unten. Wenn Sie das Muster nicht finden, merken Sie sich die aktuelle Zeile und drucken Sie die erste unbedruckte Zeile. Am Ende drucken Sie was unbedruckt ist.
%Vor%Das funktioniert natürlich nur, wenn Sie ein Muster in der Datei haben. Wenn Sie viele haben, müssen Sie 5 neue Zeilen nach dem Finden Ihres Musters lesen, und es wird kompliziert, wenn Sie Ihr Muster wieder in diesen Zeilen haben. In diesem Fall denke ich, sed ist nicht das richtige Werkzeug.
Wenn Sie das Ergebnis lieber in eine Datei als in stdout ausgeben möchten, kann vim
dies sehr effizient tun:
oder
%Vor%um die Datei direkt zu bearbeiten.