无法找到有效的sed模式

时间:2011-04-13 16:36:48

标签: sed escaping awstats

我正在尝试在几百个awstats配置文件上执行字符串替换,并使用sed来执行此操作。但是,我无法获得工作模式。

具体来说,我正试图在配置中转换这一行:

HostAliases="REGEX[^\.*example\.com$]"

进入这个:

HostAliases="REGEX[\.example\.com$]"

其中example\.com是变体。

我尝试了几十种sed命令。例如:

sed -i 's/^HostAliases="REGEX[^\.*/HostAliases="REGEX[\./' /etc/awstats/*.conf

sed -i 's/REGEX[^\.*/REGEX[\./' /etc/awstats/*.conf

但每次都会收到如下错误:sed: -e expression #1, char 49: unterminated 's' command

问题可能与逃避一些角色有关,但我无法弄清楚哪些角色或如何逃脱它们。我想使模式具体到足以避免意外地匹配配置中的其他行,因此包括HostAliases会很好。

请一些sed大师请指出我正确的方向?

4 个答案:

答案 0 :(得分:3)

's'的第一个参数本身就是一个正则表达式。所以你必须逃避(\)特殊字符。在您的情况下,他们是[\.*。所以它应该是:

sed -i 's/^HostAliases="REGEX\[^\\\.*/HostAliases="REGEX[\./' /etc/awstats/*.conf
sed -i 's/REGEX\[^\\\.\*/REGEX[\./' /etc/awstats/*.conf

答案 1 :(得分:1)

这是你的意思吗?

$ echo 'HostAliases="REGEX[^\.*example\.com$]"' | sed 's/^HostAliases=\"REGEX\[\^\\\.\*/HostAliases="REGEX[\\\./'

输出:

HostAliases="REGEX[\.example\.com$]"

答案 2 :(得分:1)

你也需要转义特殊的正则表达式字符,如下所示:

sed -i 's/REGEX\[\^\\.\*/REGEX[\\./' /etc/awstats/*.conf

答案 3 :(得分:0)

你忘了逃避一些角色,比如 ^ [。 你的sed会是这样的:

sed -e 's/REGEX\[\^\.*/REGEX\[/' -i /etc/awstats/*conf