Sed 命令和正则表达式

Sed command and regular expressions

我需要将 'bind a.b.c.d:80' 更改为 'bind x.b.f.d:80'。我为此目的写了下面的命令,但它不起作用,我不知道为什么?

sed -i 's,bind *:35357,bind x.y.z.a:35357,' haproxy-sample.cfg

如有任何帮助,我们将不胜感激。

提前致谢。

执行于bash

$ echo bind 12.54.36.165:35357 | sed "s/bind [^:]\+:35357/bind a.y.z.a:35357/"
bind a.y.z.a:35357

我想你需要这样的想法:

sed -r 's/^(bind\s+)([^.]+)\.([^.]+)\.([^.]+)\.([^.:]+)(:80(\s+.*)?)$/x..f./g' haproxy-sample.cfg

你必须用你需要的字符串替换文字 .f.x.(在 sed s 的第二部分)。

它捕获各个部分(bind,地址的四个数字,:80直到lineend进入</code>到<code>并重新组合捕获的字符串bf .

问题是您的模式包含一个单独的 * -- 您可能正在考虑 shell 通配模式,其中 * 匹配 0 个或多个任意字符。 sed 不讲 shell 模式,它讲正则表达式。 如果只有 *,则需要 .*——在正则表达式中,. 字符是匹配任何一个字符的通配符,而 *quantifier 匹配前面的零个或多个。

sed -i 's/\(bind \).*\(:35357\)/x.y.z.a/'