sed给出的前面的正则表达式无效

时间:2013-02-18 04:50:07

标签: regex bash command-line sed

我一直在研究sed脚本文件,而且我遇到了一个" Invalid Preceding正则表达式"我运行它时出错。以下是整个文件。

我已经对此进行了大量搜索,无论是在本网站还是其他地方。这里提出的许多问题都导致需要扩展正则表达式,而不正确地转义。我已将此定义为扩展表达式,因为电子邮件替换需要它。

#!/bin/sed -rf
#/find_this thing/{
#s/ search_for_this/ replace_with_this/
#s/ search_for_this_other_thing/ replace_with_this_other_thing/
#}

#Search and replace #ServerAdmin (with preceding no space) email addresses using a regular expression that has the .com .net and so on domain endings as option so it will find root@localhost and replace it in line with admin's email address.

ServerAdmin/ { 
s/\b[A-Za-z0-9._%-]+@(?:[a-zA-Z0-9-]+\.)+(\.[A-Za-z]]{2,4})?\b/email@example.com/
}
#Enable user's Public HTML directories
/UserDir/ {
s/disable$/enable/ 
s/^#User/User/
}
#Replace the only #ServerName (with preceding no space) followed space and text with Our server ip
/#ServerName */ c\ ServerName server.ip.address.here/

我将它从termal调用为./config-apache.sed /etc/httpd/conf/httpd.conf并将其返回。

/bin/sed: file ./apache-install.sed line 12: Invalid preceding regular expression

在vim第12行内部我被识别为}以上的单#Enable user's Public HTML directories

1 个答案:

答案 0 :(得分:15)

似乎GNU sed不喜欢PCRE非捕获表示法:

...(?:...)...

尝试:

s/\b[A-Za-z0-9._%-]+@([a-zA-Z0-9-]+\.)+(\.[A-Za-z]]{2,4})?\b/email@example.com/

GNU sed似乎没问题。但是,你还有一些工作要做。给定下面的第一行作为输入,输出是第二行:

abc def@ghi.jk aaa
abc email@example.comjk aaa

给出这个结果有两个问题:

  1. ]]应该是一个]
  2. 您正在寻找前一个正则表达式中的尾随点,因此您不希望在域后缀的最后部分使用后缀。
  3. 这就是工作:

    s/\b[A-Za-z0-9._%-]+@([a-zA-Z0-9-]+\.)+([A-Za-z]{2,4})?\b/email@example.com/
    
    abc def@ghi.jk aaa
    abc email@example.com aaa