2016-11-01 6 views
2

Eingangstextdatei:Extrahieren zwischen zwei Mustern in sed

#END 
this should not be extracted 
#BEGIN  
This should be extracted. 
#BEGIN 
keep going.. 
These lines should be extracted by our script. 

Everything here will be copied. 
#END 
That should be all. 
#BEGIN 
Nothing from here. 
#END 

gewünschte Ausgabe:

This should be extracted. 
#BEGIN 
keep going.. 
These lines should be extracted by our script. 

Everything here will be copied. 

Mein sed-Skript ist:

/#BEGIN/,/#END/!d 
/#END/q 
/#BEGIN/,/#END/{/#BEGIN/d;/#END/d;p;} 

Mein Skript kann das meiste, was ich möchte es tun, außer die erste #END zu ignorieren und zu drucken, was auch immer in dem ersten # BEGIN # END Block (einschließlich der verschachtelten # BEGIN) ist. Ich bin mir nicht sicher, wie ich mein Skript ändern kann, um diese Einschränkungen zu erfüllen.

Antwort

1

Dies könnte für Sie arbeitet (GNU sed):

sed -n '/^#BEGIN/,/^#END/!b;//!p;/^#END/q' file 

Grenze der zwischen gedruckten Linien #BEGIN und #END und druckt nur die nicht Kopf-/Fußzeilen. Beenden Sie, wenn Sie die erste #END schlagen.

N.B. Platzieren der Regexp zum Beenden nach dem Druckbefehl ermöglicht die zweite oder mehrere Header in der Ausgabe bleiben.

+0

Das funktioniert gut, außer wenn ich die Zeile hatte: "Es gibt keine # ENDE Zeile, um den Druck zu beenden" in meiner Eingabe, dieses Skript druckt diese Zeile nicht. Es sollte alle #END oder #BEGIN ignorieren, die nicht das erste Wort (Spalte) eines Satzes sind. – asddddddaaaad2

+0

@ asdddddaaaad2 sed bearbeiten – potong

+0

Danke, das funktioniert! Nur damit ich es besser verstehe - was macht das "! B"? Ich bin mir nicht sicher, was "b" in sed ist. Vielen Dank. – asddddddaaaad2

Verwandte Themen