2014-11-24 48 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