即使我逃脱了“括号不平衡”?

即使我逃脱了“括号不平衡”?

我正在尝试运行这个简单的sed命令

sed '/VALUES\ \([0-9]/d!'

它仍然给我一个错误"RE error: parentheses not balanced"(是的,引号在那里)。

我能做些什么?我的意思是我可以添加另一个,)但它与我的正则表达式不匹配。

答案1

转义符(具有特殊含义sed:它用于反向引用。要匹配文字(,只需使用不带反斜杠的即可:/VALUES ([0-9]/d!

如果您尝试匹配\(,请转义\\\(

逃离(空间)没有什么区别。

答案2

默认情况下,sed使用基本正则表达式 (BRE)。在BRE中,\(\)用于定义子表达式:

可以通过将子表达式括在字符对“(”和“)”之间来在 BRE 中定义子表达式。这样的子表达式应匹配没有“(”和“)”时它会匹配的任何内容,除非子表达式中的锚定是可选行为;请参阅 BRE 表达式锚定。子表达式可以任意嵌套。

然后,您可以使用反向引用表达式来匹配与和'\n'之间包含的子表达式匹配的相同(可能为空)字符串,其中从到。在这里,您只使用左括号,找不到右括号并引发错误。\(\)n19\(sed

在 BRE 中,您只需用来(匹配文字左括号。

在某些sed实现中,您可以切换到扩展正则表达式 (ERE)(例子GNU sedwith -roption),因此您必须使用\(来匹配文字左括号。

答案3

正是这个原因。在这种情况下,您不应该逃避括号。

单引号'已经告诉 shell 不要关心字符串内容,因此它按字面意思传递给 sed。转义括号是告诉 sed 将结尾\)作为子正则表达式的分隔符。

相关内容