2011-08-08 22 views
0

確定這是讓我發瘋僅更換一個領域。慶典:如何在兩行有在該領域相同內容

我已經冒號隔開4個字段的文件。我試圖只用一個變量替換最後一個字段。但問題是當兩行有相同的內容,那麼他​​們都會改變。我想我是否可以提供一個關於我想改變哪條線的參考。換句話說,如果第一個領域是R2則取代其最後一場

文件:

R1:name1:date1:black 
R2:name2:date2:black 

我希望它是這樣

R1:name1:date1:black 
R2:name2:date2:black2 

這裏是我到目前爲止

變量已經分配的第四場。名稱已被分配給用戶輸入名稱的zenity文本框。

variable=$(awk -F ":" '$2 ~ /'"$name"'/ {print $4}' file) 

sed -i 's/'$variable'/black2/g' file 

在此先感謝。

+0

爲什麼要它不會改變兩條線? –

+0

你有'/ g'(全局替換)在你的sed中。它取代了sed查找的所有值。沒有'g',只有第一場比賽會被取代。這可以嗎? –

+0

,因爲它不是相同的。 – scott

回答

2

您可以限制哪些行sed的應用其替代用:

sed -i '/^R2/s/:black$/:black2/' file 

通知的^爲線的開始,和$避免更換黑色別的地方就行了。

編輯:我除去克參數作爲每行需要單個取代成sed的。 g參數適用於行,而不適用於整體輸入。

+0

就是這樣。完美的作品,謝謝 – scott

+0

'sed -i'/^R2/s /:black $ /&2 /'file'也可能適合你。 – potong

2

或者使用awk的解決方案,但並不可能修改文件到位像sed,所以需要一個MV:

awk -F ":" '($1 == "R2" && $4 == "black"){print $1 ":" $2 ":" $3 ":black2"} ($1 != "R2" || $4 != "black"){print $1 ":" $2 ":" $3 ":" $4}' file > file1 
mv file1 file 

或可能更短:

awk -F ":" '{print $1 ":" $2 ":" $3 ($1 == "R2" && $4 == "black"? ":black2" : ":" $4)}' file > file1 
mv file1 file 
+0

我也學習了這些awk命令,但最後一個(sed)更容易理解,但無論如何感謝您提供第二個和第三個選項的努力。 – scott