我想替换一个字符串,保留前缀,除非它包含特定的前缀。
例如,"(*)-bar"
之类的任何字符串都必须替换为"(*)-blah"
,除非"(*)"
与"baz"
匹配:
foo-bar => should return foo-blah
baz-bar => should remain baz-bar
到目前为止,我所做的最好的是在替换时修剪前缀的最后一个字母:
echo "foo-bar" | sed s/"[^(baz)]-bar"/$1-blah/
答案 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