我正在尝试在几百个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大师请指出我正确的方向?
答案 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