2013-05-19 70 views
8

input.txt使用SED刪除線的範圍內,除了結束模式

blah1 
blah2 
start_pattern 
blah3 
blah4 
blah5 
end_pattern 
blah6 
blah7 

我想input.txt成爲:

blah1 
blah2 
end_pattern 
blah6 
blah7 

我嘗試以下,但沒有奏效。

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

對此深感抱歉。感謝您修復我的格式。 – Springray

+1

沒問題:)歡迎來到SO。 –

+1

在這個問題http://stackoverflow.com/q/8164604/356440他們正在處理使用'sed'的多行編輯和刪除,也許它可以給你一些線索/曲目。 –

回答

5

This question涉及您的問題:

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

完美地工作,謝謝。 – Springray

5

的sed是在單行簡單替換一個很好的工具。對於任何其他文本操作只用awk更清晰,更簡單,更易於擴展的解決方案:

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

參見:

$ 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

同意,這太漂亮了! –