2

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

例如,任何类似的字符串都"(*)-bar"必须替换为"(*)-blah"except when "(*)"matches "baz"

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

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

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

2 回答 2

3

使用负面回顾

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

大多数sed实现都没有这种高级的正则表达式功能,但它应该可以在更现代的语言中工作,例如 perl。

于 2012-11-07T21:00:42.283 回答
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
于 2012-11-07T21:03:21.883 回答