2012-07-25 95 views
1

我有以下代碼用於查找文件中的字符串,然後刪除包含該字符串的行。bash從文件中刪除一行,永久

echo `sed /$string/d file.txt` > file.txt 

的問題是,如果最初file.txt的包含:

a 
b 
c 

刪去 「a」 之後(字符串=一)file.txt的將成爲

b c 

代替

b 
c 

任何人都可以幫我嗎?

回答

6

這是因爲反引號。做到這一點,而不是:如果你想這樣做就地

sed -i /$string/d file.txt 

注意,你需要使用-ised>會破壞文件之前sed可以讀取它。

+1

我們不應該從正則表達式字符首先逃避'$ string'嗎? – Khaledvic 2014-01-01 19:59:35

+0

@Khaledvic:好的。如果'$ string'包含shell發現重要的字符,這個方法也會有問題,例如'!'。基本上,如果'$ string'的內容是未知的,你需要小心地逃避正則表達式和shell重要字符。感謝您指出。 – Thor 2014-01-16 11:51:37

2

你不需要echo包裹,只需嘗試:

sed -i '/a/d' file.txt 
2

您需要引用命令的輸出:

回聲-n 「sed /$string/d file.txt」> file.txt的

1

戰略經濟對話一個就地編輯選項。在你的senario中使用它更合適。 例如

sed -i /$string/d file.txt 

對於你的情況的問題,由於'輸出'沒有雙引號括起來,詞的拆分完成後,通過慶典。新行被刪除。 要在這種情況下使用回聲,請這樣做:

echo "`sed /$string/d file.txt`" > file.txt