正则表达式:替换带有前缀捕获的字符串,但给定前缀除外

时间:2012-11-07 20:46:03

标签: regex regex-negation

我想替换一个字符串,保留前缀,除非它包含特定的前缀。

例如,"(*)-bar"之类的任何字符串都必须替换为"(*)-blah",除非"(*)""baz"匹配:

foo-bar => should return foo-blah 
baz-bar => should remain baz-bar

到目前为止,我所做的最好的是在替换时修剪前缀的最后一个字母:

echo "foo-bar" | sed s/"[^(baz)]-bar"/$1-blah/

2 个答案:

答案 0 :(得分:3)

使用负面的背后隐藏

s/(?<!baz)-bar/-blah/

大多数sed实现都没有这种高级正则表达式功能,但它应该适用于更现代的语言,例如perl。

答案 1 :(得分:1)

使用sed:

$ echo "foo-bar" | sed '/^foo-baz/!s/^foo-.*$/foo-blah/'
foo-blah
$ echo "foo-baz" | sed '/^foo-baz/!s/^foo-.*$/foo-blah/'
foo-baz

如果我分解:

echo "foo-baz" | sed '/^foo-baz/!s/^foo-.*$/foo-blah/'
                      |        |||                   |
                      +  regex +|+ substitution part +
                                |
                              negation of regex