Kombination von -v Flag und -A Flag in Grep

8

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?

    
Daniel Standage 17.04.2013, 01:49
quelle

4 Antworten

5

Das Folgende funktioniert sowohl mit GNU sed als auch mit OS X.

%Vor%
  • finde die übereinstimmende Zeile two
  • lesen Sie in zwei weiteren Zeilen
  • lösche sie
Steven Penny 17.04.2013, 01:54
quelle
3

Sie können dies mit awk tun, wie in der folgenden Abschrift:

%Vor%

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.

    
paxdiablo 17.04.2013 01:56
quelle
2

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.

    
John Kugelman 17.04.2013 01:55
quelle
1

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.

    
Andy Lester 17.04.2013 02:59
quelle

Tags und Links