2013-03-05 96 views
2

我需要幫助執行一個文件sed語句,我似乎無法弄清楚爲什麼我有沒有工作。我仔細研究過,每個結果都有類似的結果,但我不明白爲什麼我的結果沒有我期望的結果。sed和正則表達式問題

我有一個像

192.168.10.23:7020 
192.168.10.23:4520 
192.168.10.23:3320 

與多家上市文件等等,基本上我需要192.168.10.23:XX21更換192.168.10.23:XX20。

其中,我已經嘗試:

sed 's/\:\([0-9]\)\{2\}20/\:&21/g' $file 

這給類似的結果:

192.168.10.23:702021 
192.168.10.23:452021 
192.168.10.23:332021 

也:

sed 's/\:\([0-9]\)\{2\}/\:&21/g' 

這給類似的結果:

192.168.10.23:702120 
192.168.10.23:452120 
192.168.10.23:332120 

其他嘗試根本沒有改變,或者有一個非常不同的結果。我覺得我很親密,但迄今爲止。任何幫助將非常感激!

+0

結腸是不是在正則表達式元字符,所以你不需要逃避它。下面的答案涵蓋了解決方案。你很接近,但'&'匹配正則表達式匹配的整個字符串; '\ 1'表示在第一個'\(... \)'序列中匹配的第一部分。 – 2013-03-05 21:00:05

+0

謝謝!我認爲這是我的主要問題「&」與「\ 1」。我當然需要更多地學習sed手冊頁和其他教程,但這絕對幫助我擺脫束縛。 – 2013-03-06 05:13:50

回答

2

爲什麼你就不能

sed 's/20$/21/' 

但也有可能,在原始方案的精神:

sed 's/\(:[0-9]*\)20/\121/' 

相反的&,它使用\1只循環相匹配的部分由括號括起來。

+0

真棒,謝謝!你的第二個例子完美運作。第一個沒有,我猜測失蹤的B/C「:」...文件中有20個開頭的端口(如此:2020確實存在) - 我的一個遺漏,對不起!再次感謝! – 2013-03-06 05:12:36

1

這應該工作:

sed 's/:\([0-9]\{0,3\}\)20/:\121/g' $file

另外,我假定你的端口號將是2位數的任意位置5位數的端口號。

例子: http://regexr.com?340vk