Wie erhält man alle Zeilen nach einem passenden Wort bis zum nächsten unterschiedlichen passenden Wort?
Meine Eingabe sieht beispielsweise wie folgt aus.
1
2
3
5
6
und ich muss sed
von1Zu5und in meiner Ausgabe muss ich einschließen1aber ich möchte *5* und die restlichen Zeilen nicht einschließen.
Wenn meine Datei keine5, ich muss die restlichen Zeilen bis zum Ende durchgehen lassen.
NOTIZ:Ich habe den referenzierten Link gesehen, der wie ein Duplikat meiner Frage aussieht und den Titel hat:Nur Text zwischen 2 übereinstimmenden Mustern anzeigenaber es beantwortet meine Frage nicht. Die Antworten dort enthielten keine Möglichkeit, damit umzugehen, wenn das zweite Match nicht in der Datei ist.
Antwort1
sed '/1/,/5/!d;/5/d'
Gibt die Zeilen ab einer Zeile zurück, die enthält, 1
bis zur nächsten Zeile danach, die enthält 5
(diese nicht eingeschlossen). Wenn 5
nach der Zeile, die enthält, keine Zeile folgt, die enthält, wird von der ersten Zeile, die enthält , bis zum Ende der Datei 1
gedruckt .1
Beachten Sie, dass alle entsprechenden Abschnitte gedruckt werden.
Wenn es nur einen Abschnitt gibt oder Sie nur am ersten interessiert sind, könnte ein anderer Ansatz sein:
sed -n '/1/,$!d; /5/q; p'
Das bedeutet, sed
dass das Lesen beendet wird, nachdem in derselben Zeile oder nach der ersten Zeile, die enthält, eine 5 gefunden wurde 1
.