2013-05-19 3 views
8

input.txt:uso di sed per cancellare gamma di linee ad eccezione del modello end

blah1 
blah2 
start_pattern 
blah3 
blah4 
blah5 
end_pattern 
blah6 
blah7 

Vorrei input.txt di diventare:

blah1 
blah2 
end_pattern 
blah6 
blah7 

ho provato la seguente, ma non ha funzionato.

sed -i "/start_pattern/, /end_pattern/{$!d}" input.txt 
+0

Mi dispiace. Grazie per aver corretto la mia formattazione. – Springray

+1

Nessun problema :) benvenuto su SO. –

+1

In questa domanda http://stackoverflow.com/q/8164604/356440 si tratta di editing e cancellazione multi-linea usando 'sed', forse potrebbe darti qualche indizio/traccia. –

risposta

5

This question affronta il problema:

$ sed '/start_pattern/,/end_pattern/{/end_pattern/!d}' foo.txt 
blah1 
blah2 
end_pattern 
blah6 
blah7 
+0

Funziona perfettamente, grazie. – Springray

5

sed è un ottimo strumento per semplici sostituzioni su una sola linea. Per qualsiasi altra manipolazione del testo basta usare awk per una semplice soluzione di più chiaro, più facilmente estendibile:

$ awk '/start_pattern/{f=1} /end_pattern/{f=0} !f;' file 
blah1 
blah2 
end_pattern 
blah6 
blah7 

Consulta anche:

$ awk '/start_pattern/{f=1} !f; /end_pattern/{f=0}' file 
blah1 
blah2 
blah6 
blah7 

$ awk '!f; /start_pattern/{f=1} /end_pattern/{f=0}' file 
blah1 
blah2 
start_pattern 
blah6 
blah7 

$ awk '/start_pattern/{f=1} /end_pattern/{f=0} f;' file 
start_pattern 
blah3 
blah4 
blah5 

$ awk '/start_pattern/{f=1} f; /end_pattern/{f=0}' file 
start_pattern 
blah3 
blah4 
blah5 
end_pattern 

$ awk 'f; /start_pattern/{f=1} /end_pattern/{f=0}' file 
blah3 
blah4 
blah5 
end_pattern 
+1

D'accordo, è più carino! –