Sed正则表达式和子串否定

Ant*_*ony 24 regex sed

什么是查找字符串(这是由特定字符串的前面和后面的字符串),这不正确的语法匹配特定的模式?

例如,我想利用其中的所有子开始BEGIN_,结束_END和其间的子串是等于FOO; 并用格式"(inner substring)" 替换整个子字符串.以下内容将匹配:

  • 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'
Run Code Online (Sandbox Code Playgroud)

Fre*_*Foo 38

sedIIRC中没有一般否定运算符,因为对DFA的否定的正则表达式的编译需要指数时间.你可以解决这个问题

'/BEGIN_FOO_END/b; s/BEGIN_\(.*\)_END/(\1)/g'
Run Code Online (Sandbox Code Playgroud)

其中的/BEGIN_FOO_END/b意思是:如果我们找到BEGIN_FOO_END,那么分支(跳转)到sed脚本的末尾.

  • 也可以写成'sed'/ BEGIN_FOO_END /!s/BEGIN _ \(.*\)_ END /(\ 1)/ g'` (11认同)
  • 我想注意'sed'/ BEGIN_FOO_END /!s | BEGIN _ \(.*\)_ END |(\ 1)| g'`有效,但是`sed'| BEGIN_FOO_END |!s | BEGIN _ \(.*\)_END |(\ 1)| g'`没有!显然,它允许您在后一部分中替换"/"之外的其他分隔符,但不能在第一部分中替换.奇怪的. (4认同)
  • @CommaToast `s///` 命令可以使用任意分隔符;地址不能。 (2认同)
  • 地址分隔符*可以*是任意的,但第一个分隔符必须被转义,例如:`printf '%s\n' abc | sed '\|a|,\|b|d`' - 使用带有 `--posix` 选项的 GNU sed 进行测试。 (2认同)

Htt*_*tqm 16

这个主题可能很旧,但为了完整起见,否定操作符!:

让所有不快乐成为非常快乐:

echo -e 'happy\nhappy\nunhappy\nhappy' | sed '/^happy/! s/.*/VERY HAPPY/'
Run Code Online (Sandbox Code Playgroud)

在这里找到:如何全局替换不以特定模式开头的行中的字符串