2016-11-22 140 views
1

可能是一個非常簡單的,但我相當新的bash 我試圖從包含特定字符串的.txt文件中刪除一行。該字符串被指定爲變量 「$的logline」Bash - 使用sed從文件中刪除一行

我對sed的代碼是目前:

logline="example2" 
sed -i "/$logline/d" > /root/file.txt 

/root/file.txt文件的內容是...

/root/Dir/example.txt 
/root/Dir2/example2.txt 
/root/Dir/example3.html 
... 

我想到剛剛行/root/Dir2/example2.txt被刪除。

但是,當我運行這個整個txt文件被擦去,我得到錯誤信息sed: no input files

任何想法我在這裏失蹤?

感謝

+0

您是否獲得像'sed的錯誤消息:沒有輸入files'或'sed的:-i不得與stdin'使用?如果是這樣,那麼將這個問題添加到這個問題是有幫助的。 –

+0

嗨 是的,同時擦除txt文件它也完成了說「sed:沒有輸入文件」 我已經研究了幾個小時,並嘗試了很多變體的參數格式,但無法讓它正常工作。 – William

+2

從命令中刪除'>'。 – Cyrus

回答

2

sed -i沒有輸出,所以當你重定向到一個文件時,它只會被截斷。

相反,給文件名,直接用sed不重定向:

sed -i "/$logline/d" /root/file.txt 
+0

嗨 我剛剛嘗試了這個改變,但現在我只是得到錯誤: sed:-e表達式#1,字符0:沒有以前的正則表達式 – William

+0

@William這意味着'$ logline'爲空 –

+0

I已經試過加入一個新行 回聲$的logline 此輸出什麼,我會想到爲‘/根/ TESTDIR’爲例 ,但仍然顯示了sed的.. – William

2

如果您的變量$logline包含要匹配確切的文本,sed的可能是錯誤的程序要使用。模式地址是正則表達式,您需要轉義基本RE中理解的任何元字符,包括\,*.

要刪除固定的字符串,您可能會發現它更易於使用grep -Fv;像

grep -Fv -- "$logline" <"$file" >"$file.new"; mv "$file.new" "$file" 

如果你真的必須使用SED,你應該選擇你就地是否正在編輯與-i或使用標準輸出 - 你沒有得到兩者。因此,無論

  • sed -i "/$logline/d" "$file" 
    
  • sed "/$logline/d" "$file" >"$file.new" && mv "$file.new" "$file" 
    
+0

我是bash的新手,所以可能會考慮到這一點也是爲了學習目的。然而,來自其他答案的代碼的輕微變化已經對它進行了排序,似乎正在工作。 感謝您的幫助 – William