2011-04-07 118 views
16

從該文件中刪除它,我想刪除包含了文件中的特定字符串的一行。我怎樣才能做到這一點,而不使用awk?我試圖使用sed,但我無法實現。搜索字符串和Shell腳本

回答

28

這應做到:

sed -e s/deletethis//g -i * 
sed -e "s/deletethis//g" -i.backup * 
sed -e "s/deletethis//g" -i .backup * 

它將取代的 「deletethis」 所有出現在所有文件 「」(無)(*),就地編輯它們。

在第二種形式中的圖案可被編輯一點更安全的,它使任何修改過的文件的備份,通過用「的.backup」後面添加它們。

第三種形式是這樣的sed喜歡它的一些版本。 (例如Mac OS X中)

man sed獲得更多信息。

+0

我認爲它通常是一個更好的主意引述表達,另外,我想指出,其中的sed的'-i.bak'語法創建備份文件與給定的擴展名。即也可以是'-i.backup', – 0xC0000022L 2011-04-07 16:40:58

+1

@STATUS你是對的,某些版本的sed實際上需要後綴。 – mvds 2011-04-07 16:42:30

+2

這不行。這刪除了字符串。我想刪除包含這個字符串的行 – virtue 2011-04-07 16:59:05

16
sed -i '/pattern/d' file 

使用'd'刪除一行。這至少適用於GNU-Sed。

如果您桑達沒有的選項,改變位置的文件,也許你可以使用一箇中間文件,保存修改:

sed '/pattern/d' file > tmpfile && mv tmpfile file 

直接寫入源通常不會工作:sed '/pattern/d' file > file所以如果你懷疑它,請在嘗試之前複製一份。

+1

這是正確的答案原來的問題。出於安全原因,您可以使用'-i.bak'而不是'-i'來創建原始文件的備份。 – Mike 2017-01-26 14:05:42

+0

這是不工作的busybox的'sed',它會刪除所有的線不是字符串,@mvds答案工程 – danigosa 2018-01-28 15:52:40

+0

@danigosa:嗯,這就是爲什麼MVDS答案是錯的,現在的問題是,要刪除一條線,而不是字符串。閱讀這個問題,在最有回報的答案中閱讀美德的評論。 – 2018-01-29 02:44:53

0

嘗試VIM路:

ex -s +"g/foo/d" -cwq file.txt