查找而不是匹配特定模式的子字符串(在特定字符串之前和之后的字符串)的正确语法是什么?
例如,我想要所有以BEGIN_
开头,以_END
结尾的子字符串,并且介于两者之间的子字符串是而不是等于FOO
;并将整个子字符串替换为“(内部子字符串)”格式。以下将匹配:
BEGIN_bar_END
-> (bar)
BEGIN_buz_END
-> (buz)
BEGIN_ihfd8f398IHFf9f39_END
-> (ihfd8f398IHFf9f39)
但是
BEGIN_FOO_END
不匹配。我玩过以下内容,但似乎找不到正确的语法:
sed -e 's/BEGIN_(^FOO)_END/($1)/g'
sed -e 's/BEGIN_([^FOO])_END/($1)/g'
sed -e 's/BEGIN_(?!FOO)_END/($1)/g'
sed -e 's/BEGIN_(!FOO)_END/($1)/g'
sed -e 's/BEGIN_(FOO)!_END/($1)/g'
sed -e 's/BEGIN_!(FOO)_END/($1)/g'
最佳答案
IIRC中的sed
中没有通用的否定运算符,因为编译与DFAs否定的正则表达式需要花费指数时间。您可以解决此问题
'/BEGIN_FOO_END/b; s/BEGIN_\(.*\)_END/(\1)/g'
/BEGIN_FOO_END/b
的意思是:如果找到BEGIN_FOO_END
,则分支(跳转)到sed
脚本的末尾。
关于regex - Sed正则表达式和子字符串取反,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9053100/