vom Anfang der Datei bis zum n-ten Vorkommen des Musters löschen

vom Anfang der Datei bis zum n-ten Vorkommen des Musters löschen

Suche nach einem Befehl für ein Kommandozeilentool (awk, sed usw.), um Zeilen vom Anfang einer Datei bis zum n-ten Vorkommen eines Musters auszulassen. Anders ausgedrückt: Drucken Sie nur vom n-ten Vorkommen des Musters bis zum Ende der Datei. Gehen Sie von einer Übereinstimmung pro Zeile aus; die Zeile beginnt nicht notwendigerweise mit dem Muster.

Beispielsweise vom Anfang bis zur zweiten Zeile der Datei fooim Folgenden weglassen:

something
abc foo1
maybe something else
foo2 -this line and anything before is gone- 
maybe not
foo3
something

Erwünschtes Ergebnis:

maybe not
foo3
something

Bonuspunkte für das Einschließen/Ausschließen der Zeile mit dem n-ten Vorkommen.

Antwort1

Zuausschließendas n- te Vorkommen des Musters

awk -v 'n=3' 'NR == 1, /pattern/ && !--n {next}; 1'

(Ersetzen Sie 3durch die gewünschte Anzahl der Vorkommen (in Ihrem Fall 2) und patterndurch Ihr tatsächliches Muster ( fooin Ihrem Fall)).

Beispiel:

$ seq 30 | awk -v 'n=3' 'NR == 1, /6/ && !--n {next}; 1'
27
28
29
30

Zuenthaltendas n- te Vorkommen des Musters

awk -v 'n=3' '/pattern/ && !--n, 0'

Beispiel:

$ seq 30 | awk -v 'n=3' '/6/ && !--n, 0'
26
27
28
29
30

Antwort2

% perl -ne 'BEGIN{$NTH=2;$p=0} print if $p; /foo/ && $NTH--; $p=1 if !$NTH' input
maybe not
foo3
something

Wo NTHsteht, wie oft? Dann benötigen Sie ein Druckflag; NTHbei Übereinstimmung dekrementieren und Drucken aktivieren, wenn NTHausreichend dekrementiert wurde.Bewegen Sie sich printbis zum Ende, um das endgültig gewünschte Ergebnis zu erzielen foo.

verwandte Informationen