Übereinstimmung von der aktuellen Zeile bis zu einer Zeile, die keinem Muster entspricht

Übereinstimmung von der aktuellen Zeile bis zu einer Zeile, die keinem Muster entspricht

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 sedBefehl 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:

  • :looperstellt ein Label mit dem Namenloop
  • pdruckt die aktuelle Zeile
  • nholt die nächste Zeile
  • /SOMETHING/b loopverzweigt zu „ loopwenn Zeile übereinstimmt“/SOMETHING/
  • qwenn 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.

verwandte Informationen