2014-11-24 47 views
1

假設一個簡單的文本文件來替換IP:使用SED使用正則表達式

123.123.123.123 

我想與222.222.222.222更換IP它裏面。我曾嘗試以下,但沒有什麼變化,但是相同的正則表達式似乎工作in this Regexr

sed -i '' 's/(\d{1,3}\.){3}\d{1,3}/222.222.222.222/' file.txt 

我缺少的東西?

+0

嘗試添加/ g標誌 – nacholibre 2014-11-24 16:11:55

+0

沒什麼區別。但我不明白爲什麼全局標誌會在裸露的文件中改變一個IP地址:/ – railsuser400 2014-11-24 16:13:08

+1

BSD sed不支持'\ d'。使用POSIX字符類。 – 2014-11-24 16:13:15

回答

1

兩個問題在這裏:

  • 的sed不喜歡PCRE數字財產\d,使用範圍:[0-9]或POSIX [[:digit:]]
  • 您需要使用-r標誌擴展的正則表達式爲好。

這應該工作:

s='123.123.123.123' 
sed -r 's/([0-9]{1,3}\.){3}[0-9]{1,3}/222.222.222.222/' <<< "$s" 
222.222.222.222 

更好的辦法是使用錨避免匹配意外輸入:

sed -r 's/^([0-9]{1,3}\.){3}[0-9]{1,3}$/222.222.222.222/' <<< "$s" 

PS:在OSX使用-E代替-r

sed -E 's/^([0-9]{1,3}\.){3}[0-9]{1,3}$/222.222.222.222/' <<< "$s" 
222.222.222.222 
+0

我可以用整數範圍替換'\ d',但OSX sed似乎沒有'-r'作爲標誌 – railsuser400 2014-11-24 16:14:24

+0

爲OSX增加了一個選項,即使用'-E' – anubhava 2014-11-24 16:15:42

+1

很好。這樣可行。將在9米接受 – railsuser400 2014-11-24 16:16:46

1

您最好使用-r,如anubhava所示。

但是如果你沒有它,你必須逃避每一個(,), {}。而且,使用[0-9]代替\d

$ sed 's/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/222.222.222.222/' <<< "123.123.123.123" 
222.222.222.222