2013-02-11 104 views
1

我正在建立一个.sed文件来启动脚本安装多个Apache服务器。我试图让sed匹配.conf文件中的默认网站管理员电子邮件地址,该文件与此egrep非常相称。然而,当我使用sed来尝试替代搜索和替换时,我不会返回任何错误,但它也不会进行任何替换。我通过再次运行相同的egrep命令来测试它。SED命令匹配正则表达式,但不能替代

egrep -o '\b[A-Za-z0-9._%-][email protected][A-Za-z0-9.-]+(\.[A-Za-z]{2,4})?\b' /home/test/httpd.conf 

回报

[email protected] 
[email protected] 
[email protected] 

我试图用sed命令是

sed -i '/ServerAdmin/ s/\b[A-Za-z0-9._%-][email protected][A-Za-z0-9.-]+(\.[A-Za-z]{2,4})?\b/[email protected]/g' /home/test/httpd.conf 

运行我试图通过再次运行egrep的验证结果后,它返回相同3个电子邮件地址表示没有被替换。

+0

我不得不使这个扩展的正则表达式,它现在取代了除地址之外的所有地址。它错过了“[email protected]” 更新:可能是因为它没有在@ – 2013-02-11 00:39:34

+1

是你的'admin @ your-domain.com'在conf文件中的'ServerAdmin'之后的区域中寻找“ - ”? – Kent 2013-02-11 00:46:34

+1

不知道,我一直在与这个战斗,忘了甚至检查。猜我已经回答了我自己的问题,然后与它需要扩展正则表达式 – 2013-02-11 00:58:54

回答

0

必须告诉sed,它需要使用-r选项使用扩展正则表达式,然后按如下方式生成sed命令。

sed -ir '/ServerAdmin/ s/\b[A-Za-z0-9._%-][email protected][A-Za-z0-9.-]+(\.[A-Za-z]{2,4})?\b/[email protected]/g' /home/test/httpd.conf 

很大程度上得益于Kent的指出这是缺少wasnt地址之后的ServerName

1

不要假设任何两个工具使用相同的正则表达式语法。如果您打算使用sed替换,请使用sed进行测试 - 而不是egrep。使用sed很容易,就好像它是一个grep命令:sed -ne '/pattern/p'

+0

我只是想让你知道,我已经回来阅读这个语法至少六十倍。其中一天,我会记住它,它将是无价的 – 2013-04-01 22:52:57