it-swarm.com.de

Drucken Sie Zeilen einer Datei zwischen zwei übereinstimmenden Mustern

Wie kann ich alle Zeilen zwischen zwei Zeilen drucken, beginnend mit einem Muster für die erste Zeile und endend mit einem anderen Muster für die letzte Zeile?


Update
Ich denke, es war ein Fehler zu erwähnen, dass dieses Dokument HTML ist. Ich habe anscheinend einen Nerv berührt, also vergiss das. Ich versuche nicht, HTML zu analysieren oder etwas anderes damit zu tun, als einen Abschnitt eines Textdokuments zu drucken.


Betrachten Sie dieses Beispiel:

aaa
bbb
pattern1
aaa pattern2
bbb
ccc
pattern2
ddd
eee
pattern1
fff
ggg

Jetzt möchte ich alles zwischen der ersten Instanz von pattern1 Am Anfang einer Zeile und pattern2 Am Anfang einer anderen Zeile drucken. Ich möchte die Zeilen pattern1 Und pattern2 In meine Ausgabe aufnehmen, möchte aber nach der Zeile pattern2 Nichts mehr.

pattern2 Befindet sich in einer der Zeilen des Abschnitts. Ich möchte hier nicht aufhören, aber das kann leicht behoben werden, indem der Zeilenanfang mit ^ Angezeigt wird.

pattern1 Erscheint in einer anderen Zeile nach pattern2, Aber das möchte ich mir überhaupt nicht ansehen. Ich suche nur nach allem zwischen der first Instanz von pattern1 Und der ersten Instanz von pattern2, Einschließlich.

Ich habe etwas gefunden, das mich mit sed fast dorthin bringt:

sed -n '/^pattern1/,/^pattern2/p' inputfile.txt

... aber das wird bei der nächsten Instanz von pattern1 erneut gedruckt.

Ich kann mir eine Methode vorstellen, bei der grep -n ... | cut -f1 -d: Zweimal verwendet wird, um die beiden Zeilennummern zu erhalten, dann tail und head, um den gewünschten Abschnitt zu erhalten, aber ich hoffe auf einen saubereren Weg . Vielleicht ist awk ein besseres Werkzeug für diese Aufgabe?

Wenn ich das zum Laufen bringe, hoffe ich, dies in einen git -Haken zu binden. Ich weiß auch noch nicht, wie ich das machen soll, aber ich lese und suche immer noch :)

Vielen Dank.

19
Vince

Sie können sed bei einem Muster mit sed '/pattern/q' Beenden lassen, sodass Sie nur Ihre Übereinstimmungen benötigen und dann beim zweiten Mustervergleich beenden:

sed -n '/^pattern1/,/^pattern2/p;/^pattern2/q'

Auf diese Weise wird nur der erste Block angezeigt.

24
Fiximan

Im Allgemeinen ist es mit sed einfach, Zeilen von einer Übereinstimmung zur nächsten einschließlich zu drucken:

$ seq 1 100 > test
$ sed -n '/^12$/,/^15$/p' test
12
13
14
15

Mit awk können Sie dasselbe tun:

$ awk '/^12$/{flag=1}/^15$/{print;flag=0}flag' test
12
13
14
15

Sie können diese nicht inklusiv wie folgt machen:

$ awk '/^12$/{flag=1;next}/^15$/{flag=0}flag' test
13
14

$ sed -n '/^12$/,/^15$/p' test | sed '1d;$d'
13
14
9
Will