2014-01-06 9 views
18

Ich habe eine Datei:Wie kann ich sed nach dem ersten übereinstimmenden Adressbereich beenden?

header 
trigger 
text1 
text2 
trigger 
text5 
trigger 
... 
trigger 
... 

ich zwischen den ersten beiden Vorkommen von ‚Trigger‘, um nur Spiel sed will. Also habe ich versucht:

sed -n '/trigger/,/trigger/p' 

Aber als der Mann Seite für sed sagt, dass alle Vorkommen innerhalb von zwei Linien übereinstimmt mit ‚Trigger‘. Ich möchte, dass sed nach der ersten Übereinstimmung beendet wird, also würde die Ausgabe lauten:

Wie bewerkstellige ich das?

+0

möglich Duplikat (http://stackoverflow.com/questions/1773939/how-to-use-sed-to-return-etwas-von-first-line-which-matches-and-quit-early) – SamB

+0

Nicht von dem, was ich sehen kann. Ich möchte nach dem ersten Adressbereich aufhören, nicht nach dem ersten Auftreten. – PonyEars

Antwort

26

Sie können diese sed in GNU mit einer Schleife tun:

sed -n '/trigger/{p; :loop n; p; /trigger/q; b loop}' 

Erläuterung:

  1. Wenn Sie den ersten /trigger/ sehen, starten Sie einen Block von Befehlen
  2. p - drucken die Zeile
  3. :loop - Legen Sie eine Bezeichnung mit dem Namen loop
  4. n - erhalten die nächste Zeile
  5. p - drucken Sie die Linie
  6. /trigger/q - wenn die Leitung /trigger/ passt dann verlassen sed
  7. Sprung zu loop
+0

Vermissen Sie kein Semikolon nach 'b loop'? –

+1

@MateuszPiotrowski Nein, ich habe es jetzt wieder versucht, es funktioniert einfach so – janos

+0

Vielleicht ist es nur mein OS X sed dann. –

2

Während Jasons ans, was um Sie suche ich, hätte ich bevorzugt awk für diese Aufgabe verwendet

awk '/trigger/{p++} p==2{print; exit} p>=1' file 
Ausgang 10

:

trigger 
text1 
text2 
trigger 

Diese mehr Flexibilität bieten würde Linien zwischen n ten und m das Auftreten von trigger zu wählen.

z.

$ awk -v n=2 -v m=3 '/trigger/{p++} p==m{print; exit} p>=n' file 
trigger 
text5 
trigger 
+0

Danke. In diesem speziellen Fall benötige ich tatsächlich sed wegen einer Menge anderer Befehle, die ich in der Frage nicht gezeigt habe, aber ich würde definitiv Ihre awk-basierte Lösung im allgemeinen Fall finden. Und zwar für die Flexibilität des n/m-Ereignisses. Danke noch einmal! – PonyEars

1

Eine weitere awk Variation: [? Wie sed nutzen, um etwas von der ersten Zeile zurück, die früh Spiele und beenden]

awk '/trigger/{f++} f; f>1 {exit}' file 
Verwandte Themen