2012-03-02 306 views
48

我是sed的新手,我有以下問題。在這個例子中:sed刪除行不包含特定字符串

some text here 
blah blah 123 
another new line 
some other text as well 
another line 

我要刪除除包含任何字符串「文本」 或字符串「嗒嗒」的所有行,所以我的輸出文件看起來像這樣:

some text here 
blah blah 123 
some other text as well 

任何提示如何使用sed來完成?

+3

必由之路答案用sed? grep會很容易地做到這一點。 – Tim 2012-03-02 23:48:06

回答

11

您只想打印與'text'或'blah'(或兩者)匹配的行,'and'和'or'之間的區別非常重要。

sed -n -e '/text/{p;n;}' -e '/blah/{p;n;}' your_data_file 

-n表示默認情況下不打印。第一種模式搜索'文本',如果匹配則打印它並跳到下一行;第二種模式對'blah'也一樣。如果'n'不在那裏,那麼包含'text和blah'的行將被打印兩次。儘管我只能使用-e '/blah/p',但對稱性更好,尤其是在需要擴展匹配單詞列表的情況下。

如果您的sed版本支持擴展正則表達式(例如,GNU sed確實,與-r),那麼你就可以簡化到:

sed -r -n -e '/text|blah/p' your_data_file 
+3

如果sed不支持'-r',它可能也不會支持'{}'。這應該適用於較老的seds:'sed'/ text \ | blah /!d'file' – 2012-03-03 01:10:54

+0

'{...}'命令分組是在第7版UNIX版本的'sed';我想不出你怎麼會遇到一個沒有支持的版本。 – 2012-03-03 03:10:03

79

這可能會爲你工作:

sed '/text\|blah/!d' file 
some text here 
blah blah 123 
some other text as well 
+0

謝謝,這是有效的。 – user1246172 2012-03-04 22:04:28

+1

我怎樣才能例如指定文本或等值只能出現在最後一列? – discipulus 2014-05-14 12:27:52

+2

@lovedynasty如果你的意思是*在行尾*,你應該使用'$':''/ text $ \ | blah $ /!d'' – Melebius 2015-02-12 11:58:49

5

你可以簡單地做它通過AWK,

$ awk '/blah|text/' file 
some text here 
blah blah 123 
some other text as well