Wie kann ich das erste Vorkommen zwischen zwei Mustern einschließlich auswählen? Vorzugsweise mit sed
oder awk
.
Ich habe:
text
something P1 something
content1
content2
something P2 something
text
something P1 something
content3
content4
something P2 something
text
Ich möchte das erste Auftreten der Linien zwischen P1 und P2 (einschließlich P1-Linie und P2-Linie):
something P1 something
content1
content2
something P2 something
sed
awk
regular-expression
kofucii
quelle
quelle
sed
... das ist ein Fehlersed
, der nicht im obigen Skript enthalten ist./P2/q
auf meinem System sowohl mit als auch ohne funktioniert; das ist es. Ich war neugierig auf etwas und wollte mitteilen, was ich gefunden habe.mit
awk
quelle
In
sed
:-n
unterdrückt den Standarddruck und Sie drucken mit demp
Befehl Zeilen zwischen den übereinstimmenden Adressbereichen .q
) beenden, wenn die ersteP2
Übereinstimmung vorliegt.Dies wird scheitern, wenn ein vor
P2
kommtP1
. Um diesen Fall zu behandeln, versuchen Sie:quelle
Wenn Sie die Muster selbst überspringen möchten, finden Sie hier die
awk
Version:quelle
Eine einfachere
awk
Lösung (auf halbem Weg zwischen Iruvars Antwort und Murus Antwort , aber ohne Verwendung einer Variablen):und, wie muru bemerkte, wenn das erste P2 vor dem ersten P1 erscheint, druckt dies nichts.
Natürlich, wenn Sie alle P1-P2-Bereiche drucken möchten:
Lass einfach das
exit
Teil weg :quelle
Beenden Sie sofort nach dem Drucken, nicht vorher.
quelle
So überspringen Sie die Muster selbst und zeigen nur den ersten passenden Block in einer einzelnen GNU sed an:
quelle