2012-11-07 26 views
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/ 
+0

'[^(巴茲)]'並不意味着你認爲它。 '[^ ...]'匹配不是括號中的字符之一的單個字符。 – Barmar

回答

3

使用否定後視

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

大多數sed實現沒有這種先進的正則表達式功能,但它應該用更現代的語言,如perl。

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 
相關問題