2013-05-19 13 views
8

input.txt:Korzystanie sed, aby usunąć zakres linii z wyjątkiem wzoru końcowego

blah1 
blah2 
start_pattern 
blah3 
blah4 
blah5 
end_pattern 
blah6 
blah7 

Chciałbym input.txt stać:

blah1 
blah2 
end_pattern 
blah6 
blah7 

Próbowałem następujących, ale to nie działa.

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

Niestety o tym. Dzięki za naprawienie mojego formatowania. – Springray

+1

Nie ma problemu :) witamy na SO. –

+1

W tym pytaniu http://stackoverflow.com/q/8164604/356440 mają do czynienia z edycją i usuwaniem wielu wierszy za pomocą 'sed', może to może dać ci kilka wskazówek/ścieżek. –

Odpowiedz

5

This question dotyczy problemu:

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

Działa doskonale, dzięki. – Springray

5

sed jest doskonałym narzędziem do prostych podstawień w jednej linii. Dla każdego inna manipulacja tekst wystarczy użyć awk o jaśniejszym, prostszym, bardziej łatwo rozszerzalny rozwiązanie:

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

Zobacz także:

$ 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

Uzgodnione, ładnie! –

Powiązane problemy