无法找到有效的 sed 模式

发布于 2024-11-01 02:20:19 字数 684 浏览 4 评论 0原文

我正在尝试对数百个 awstats 配置文件执行字符串替换,并使用 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: untermerated 's' command

这个问题可能与转义某些字符有关,但我可以'不知道哪些是哪些或如何逃脱它们。我想让模式足够具体,以避免意外匹配配置中的其他行,因此包含 HostAliases 会很好。

一些 sed 大师可以指出我正确的方向吗?

I'm trying to perform a string replacement on several hundred awstats config files, and using sed to do so. However, I'm having trouble getting a working pattern.

To be specific, I'm trying to convert this line in the configs:

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

into this:

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

where example\.com is variant.

I've tried dozens of variations of sed command. For example:

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

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

but each time get an error like: sed: -e expression #1, char 49: unterminated 's' command

The issue is probably to do with escaping some of the characters but I can't figure out which ones or how to escape them. I want to make the pattern specific enough to avoid accidentally matching other lines in the config, so including the HostAliases would be good.

Could some sed guru please point me in the right direction?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

末が日狂欢 2024-11-08 02:20:20

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

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

The first argument to 's' is itself a regular expression. So you have to escape (with \) the special characters. In your case they are [, \, . and *. So it should be:

sed -i 's/^HostAliases="REGEX\[^\\\.*/HostAliases="REGEX[\./' /etc/awstats/*.conf
sed -i 's/REGEX\[^\\\.\*/REGEX[\./' /etc/awstats/*.conf
怂人 2024-11-08 02:20:20

你是这个意思吗?

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

输出:

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

Is this what you mean?

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

Outputs:

HostAliases="REGEX[\.example\.com$]"
栀梦 2024-11-08 02:20:20

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

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

You need to escape special regular expression characters too, like this:

sed -i 's/REGEX\[\^\\.\*/REGEX[\\./' /etc/awstats/*.conf
浅语花开 2024-11-08 02:20:20

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

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

You forgot to escape some chars, like ^ and [ .
Your sed would be something like this:

sed -e 's/REGEX\[\^\.*/REGEX\[/' -i /etc/awstats/*conf
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文