Sed命令和正则表达式

时间:2016-04-09 12:54:34

标签: regex sed ubuntu-14.04

我需要将'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

任何帮助都将不胜感激。

提前致谢。

3 个答案:

答案 0 :(得分:1)

从bash执行

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

答案 1 :(得分:0)

我认为你需要这样的想法:

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

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

它捕获各个部分(bind,地址的四个数字,:80直到lineend到\1\6并重新捕获所捕获的字符串bf

答案 2 :(得分:0)

问题是你的模式包含一个* - 你可能正在考虑shell *匹配0个或更多任何字符的shell globbing模式。 sed不会说shell模式,它会说正则表达式。 只有*,您需要.* - 在正则表达式中,.字符是匹配任何一个字符的通配符,而*量词匹配前面的零个或多个。

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