1

我正在尝试对数百个 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

4 回答 4

3

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

sed -i 's/^HostAliases="REGEX\[^\\\.*/HostAliases="REGEX[\./' /etc/awstats/*.conf
sed -i 's/REGEX\[^\\\.\*/REGEX[\./' /etc/awstats/*.conf
于 2011-04-13T16:46:56.353 回答
1

你是这个意思吗?

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

输出:

HostAliases="REGEX[\.example\.com$]"
于 2011-04-13T16:45:46.603 回答
1

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

sed -i 's/REGEX\[\^\\.\*/REGEX[\\./' /etc/awstats/*.conf
于 2011-04-13T16:47:23.760 回答
0

您忘记转义一些字符,例如^[。你的 sed 会是这样的:

sed -e 's/REGEX\[\^\.*/REGEX\[/' -i /etc/awstats/*conf
于 2011-04-13T16:48:55.787 回答