
Ich habe die Suche wirklich bemüht, konnte aber nichts finden (es ist schwer zu wissen, wonach man genau suchen soll).
Ich weiß, wie das geht mit sed
: Drucken von der aktuellen Zeile bis zur Zeile, die mit ETWAS übereinstimmt:
sed -n '/1/,/SOMETHING/p'
Aber wie mache ich das Gleiche, aber drucke von der aktuellen Zeile bis zur Zeile, dienichtpasst zu ETWAS?
zB leiten Sie dies weiter in sed
:
blah blah SOMETHING blah blah
blah blah SOMETHINGblahblahblah
SOMETHING blah blah
NO MATCH HERE
Dann möchte ich nur die ersten 3 Zeilen herausfiltern und drucken (aber „3“ kann variieren).
Antwort1
Dies ist möglicherweise nicht so allgemein, wie Sie wirklich möchten, aber hier ist ein Ausgangspunkt:
sed -n '/SOMETHING/!q;p'
Dies bedeutet: Überprüfen Sie, ob eine Übereinstimmung mit vorliegt /SOMETHING/
. Wenn die Zeilepasst nicht(mit !
invertieren Sie das Testergebnis), und beenden Sie dann. Andernfalls drucken Sie diese Zeile und fahren mit der nächsten Zeile fort.
Dies ist nicht unmittelbar flexibel genug, um Ihnen das Gewünschte und auch andere Manipulationen an der Datei mit demselben sed
Befehl zu ermöglichen.
Antwort2
Sie können eine Schleife in folgendem versuchen sed
:
$ sed -n '{:loop p; n; /SOMETHING/b loop; q}' test.txt
blah blah SOMETHING blah blah
blah blah SOMETHINGblahblahblah
SOMETHING blah blah
Das:
:loop
erstellt ein Label mit dem Namenloop
p
druckt die aktuelle Zeilen
holt die nächste Zeile/SOMETHING/b loop
verzweigt zu „loop
wenn Zeile übereinstimmt“/SOMETHING/
q
wenn die Verzweigung nicht stattfindet.
Dies druckt in jedem Fall eine Zeile. (Kann wahrscheinlich mit der Antwort von G-Man behoben werden.)
Adaptiert vondiese SO-Frage.