2

特定のプレフィックスが含まれている場合を除いて、プレフィックスを保持したまま文字列を置き換えたい。

たとえば、次のような文字列は、一致する場合を除いて、"(*)-bar"に置き換える必要があります。"(*)-blah""(*)""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 に答える