Wie würde ich Muster und numerische Bereiche in sed mischen (oder einem ähnlichen Werkzeug - zum Beispiel awk)? Ich möchte bestimmte Zeilen in einer Datei abgleichen und die nächsten n Zeilen löschen, bevor ich fortfahre. Dies möchte ich als Teil einer Pipeline tun.
105
+N
Muster eine GNU-Erweiterung ist. Ändern Sie die ersten
in eineN
in Ihrem zweiten Beispiel, damit sie die Linie mit dem Muster enthält./pattern/,+5
einen Bereich, der mit einer Zeile mit "pattern" (/pattern/
) beginnt und 5 Zeilen später endet (+5
). Das letzte Zeichend
ist ein Befehl, der in jeder Zeile in diesem Bereich ausgeführt wird. Dies ist "Löschen". Im zweiten Rezept stimmt es nicht mit einem Bereich überein, sondern nur mit der Zeile, die das Muster enthält (/pattern/
), und führt dann eine Reihe von Befehlen aus :{n;N;N;N;N;d}
, die im Grunde die nächste Zeile (n
) drucken und dann die nächsten 4 Zeilen lesen und schließlich verwerfen (N;N;N;N;d
).sed -e '/pattern/{n;N;N;N;N;d;}' file.txt
something
:sed -E '/^something$/,$d'
Wo-E
befindet sich der erweiterte reguläre Ausdruck für die POSIX-Portabilität?Ohne GNU-Erweiterungen (zB unter macOS):
So löschen Sie 5 Zeilen nach einem Muster (einschließlich der Zeile mit dem Muster)
In
-i ''
zu bearbeiten in-place.quelle
Einfache
awk
Lösungen:Angenommen, der reguläre Ausdruck, der zum Suchen übereinstimmender Zeilen verwendet werden soll, wird in der Shell-Variablen gespeichert
$regex
und die Anzahl der zu überspringenden Zeilen$count
.Wenn die übereinstimmende Zeile ebenfalls übersprungen werden soll (
$count + 1
Zeilen werden übersprungen):Wenn die passende Linie nicht sollte übersprungen werden soll (
$count
Zeilen nach der Übereinstimmung werden übersprungen):Erläuterung:
-v regex="$regex" -v count="$count"
definiertawk
Variablen basierend auf gleichnamigen Shell- Variablen.$0 ~ regex
entspricht der interessierenden Linie{ skip=count; next }
Initialisiert die Anzahl der Übersprungen und fährt mit der nächsten Zeile fort, wodurch die übereinstimmende Zeile effektiv übersprungen wird. in der 2. Lösung dieprint
Vorhernext
sicher, dass es nicht übersprungen wird.--skip >= 0
Verringert die Anzahl der Übersprungen und ergreift Maßnahmen, wenn sie (noch)> = 0 ist, was bedeutet, dass die vorliegende Zeile übersprungen werden sollte.{ next }
Fahren Sie mit der nächsten Zeile fort und überspringen Sie die aktuelle Zeile1
ist eine häufig verwendete Abkürzung für{ print }
; Das heißt, die aktuelle Zeile wird einfach gedruckt1
dafür{ print }
ist, dass er1
als boolesches Muster interpretiert wird, das per Definition immer als wahr ausgewertet wird, was bedeutet, dass die zugehörige Aktion (Block) bedingungslos ausgeführt wird. Da in diesem Fall keine Aktion zugeordnet ist, wirdawk
standardmäßig die Zeile gedruckt .quelle
Dies könnte für Sie funktionieren:
quelle
pattern_number.txt
ist eine zweispaltige Datei, die das Muster enthält, das in der ersten Spalte übereinstimmt, und in der zweiten die Anzahl der zu überspringenden Zeilen. Der erstesed
Befehl wandelt die Datei in einsed
Skript um, das den entsprechenden Abgleich und das Überspringen ausführt. Dieses Skript wird über-f
und stdin (-
) für den 2.sed
Befehl bereitgestellt . Der 2.sed
Befehl verarbeitet eine Beispiel-Ad-hoc-Eingabedatei, die aus der Ausgabe von erstellt wurdeseq 21
, um zu demonstrieren, dass sie funktioniert.Verwenden von Perl
quelle
Mit dieser Lösung können Sie "n" als Parameter übergeben und Ihre Muster aus einer Datei lesen:
Die Datei mit dem Namen "-" bedeutet stdin für awk, daher ist dies für Ihre Pipeline geeignet
quelle