2011-04-13 71 views
1

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

具体而言,我想这条线转换在configs:

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大师请指点我正确的方向吗?

回答

3

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

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

谢谢,你的回答让我想到正确的方式,所以我可以解决我自己的问题。我需要的实际sed命令是'sed -i's/^ HostAliases =“REGEX \ [^ \\\。\ */HostAliases =”REGEX [\\ ./'/ etc/awstats/*。conf'。我正在授予最佳解释的观点。 – 2011-04-13 20:32:35

1

这是你的意思吗?

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

输出:

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

+1为工作的答案和教我一个更好的调试方法。我接受了Jan的答案,因为它教会了我为什么。 – 2011-04-13 20:38:51

1

你需要转义特殊正则表达式字符太,像这样:

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

作品。不清楚为什么。 – 2011-04-13 20:46:05

0

你忘了逃避一些字符,像^[。 你的sed会是这样的:

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

不完全正确,但一开始。谢谢。 – 2011-04-13 20:44:09