2013-02-18 44 views
0

我的第一篇文章和初學者級別。有沒有一種方法可以用sed(或其他方法)解決這個問題?我想每天操作一個新創建的文件並替換一些IP和端口發生。用sed或其他命令替換非唯一的出現

1)我想用A3替換第一次出現的「5027,5028」,用A4替換第二次出現。 2)我想用A1替換第一個出現的「5026」,用A2替換第二個。

PS。我試圖簡化這個例子,並用version =「y」或version =「x」留下前面的行,這可能有助於區分彼此的出現。 (第一個x和y版本對是主要連接,另外兩個是次要連接)。

輸入文件:

version="x" 
commaSeparatedList="5027,5028"` 
version="y" 
commaSeparatedList="5026" 
version="x" 
commaSeparatedList="5027,5028" 
version="y" 
commaSeparatedList="5026" 

編輯後的文件:

version="1.4.1-12" 
commaSeparatedList="A3" 
version="1.3.0" 
commaSeparatedList="A1" 
version="1.4.1-12" 
commaSeparatedList="A4" 
version="1.3.0" 
commaSeparatedList="A2" 

對不起,我有幾分鐘的一些編輯恐怖。希望現在看起來更容易理解。我基本上是在夜間部署的系統上接收此文件,並且我想在開始確保連接正常工作之前使用cron作業編輯此文件。

+0

兩個問題:1)是在同一條線上,可以重複號碼?如何處理。 2),如果3rd,4th ... 5026來...保留'A2'?或者它不會發生? – Kent 2013-02-18 14:10:30

+0

和第三個問題,爲什麼輸入是y-y-x-y,輸出是x-y-x-y? – Kent 2013-02-18 14:17:02

回答

2

不要打擾嘗試使用sed這一點。它可以完成,但sed是錯誤的工具。

改爲使用awk。用A3替換第一次出現的「5027,5028」,用A4替換第二次。

awk '/5027,5028/ && count < 2 { if(count ++) repl="A4"; else repl="A3"; 
    sub("5027,5028", repl)} 1' input 

第二個替換是留作練習。它基本上是一樣的,你可以運行awk兩次,或者只是添加上面的附加子句。

覆蓋原文件,使用shell重定向:

awk ... input > tmpfile && mv tmpfile input 
+0

非常感謝,很快就會測試出來! – 2013-02-18 14:25:32

1

這可能會爲你(GNU SED)工作:

sed '1,/5027,5028/s/5027,5028/A3/;s/5027,5028/A4/;1,/5026/s/5026/A1/;s/5026/A2/' file 
+0

這就像一個魅力,謝謝! – 2013-02-18 15:28:26