2017-11-18 187 views
0

我有四個名爲source,correct,wrong和not_found的文件。我試圖在bash中編寫腳本,其中我從源文件中讀取每行,將行存儲爲變量x,並將其與條件匹配。Bash:從匹配變量的文件中刪除一行

如果它通過,那麼我需要將該行寫入文件名爲correct,但是catch在寫入到正確前我需要檢查變量x當前是否存在於名爲wrong的文件中,如果是,請刪除它,然後將該行添加到名爲correct的文件。

下面我都試過了,但它不修改該文件並沒有給我任何輸出:

sed -i '/$x/d' ./wrong 
+0

我想你的意思是'sed',而不是'send'。如果你使用單引號,就不會有擴展,所以你實際上是在尋找'$ x'(字面上),而不是那個變量的內容。改爲使用雙引號:'sed -i「/ $ x/d」。/ wrong「 –

+0

感謝您指出錯誤。這實際上是我的iPad做自動更正。我現在糾正了錯誤。 –

+0

'sed'不修改文件:從標準輸入中讀取並在標準輸出上寫入。您需要將結果放在某處,然後替換原始文件。如:'sed -i'/ $ x/d'./wrong> ./wrong.new && mv ./wrong ./wrong.old && mv ./wrong.new。/ wrong'(如果您想保留舊的副本)。 – fernand0

回答

0

正如你已經明白了,裏面'...'變量沒有擴大。

如果換成單引號用雙引號, 這將從./wrong刪除匹配行:

sed -i "/$x/d" ./wrong 

但你也想將行添加到./correct,如果有一個匹配。 要做到這一點,你可以在sed之前運行grep

grep "$x" ./wrong >> ./correct 

這將產生預期的效果,但 將sed覆蓋./wrong,即使它並不需要。 你可以防止像這樣:

if grep "$x" ./wrong >> ./correct; then 
    sed -i "/$x/d" ./wrong 
fi 
+0

感謝Janos,我實際上需要刪除包含x的行和從./wrong後面的下兩行。另外, –

+0

感謝Janos,我實際上需要刪除包含x的行以及從./wrong後面的下兩行。所以,我在做如果grep「$ x」./wrong;then ;sed -i「/ $ x /,+ 2d」./wrong;echo $ x >> ./正確; echo line2 >> ./正確: fi我正在運行一個單獨的for循環之前,如果循環保持行2和行3。我是否想從錯誤中刪除x的決定取決於line2和line3。因此,我不能直接從錯誤中直接複製包含x和下兩行的行來糾正。 –

+0

@DattarayaHonrao您正在添加不屬於原始問題的重要新細節。問一個新問題會更好,包括你真正需要的所有細節。 – janos