我正在尝试运行这个简单的sed
命令
sed '/VALUES\ \([0-9]/d!'
它仍然给我一个错误"RE error: parentheses not balanced"
(是的,引号在那里)。
我能做些什么?我的意思是我可以添加另一个,)
但它与我的正则表达式不匹配。
答案1
答案2
默认情况下,sed
使用基本正则表达式 (BRE)。在BRE中,\(
和\)
用于定义子表达式:
可以通过将子表达式括在字符对“(”和“)”之间来在 BRE 中定义子表达式。这样的子表达式应匹配没有“(”和“)”时它会匹配的任何内容,除非子表达式中的锚定是可选行为;请参阅 BRE 表达式锚定。子表达式可以任意嵌套。
然后,您可以使用反向引用表达式来匹配与和'\n'
之间包含的子表达式匹配的相同(可能为空)字符串,其中从到。在这里,您只使用左括号,找不到右括号并引发错误。\(
\)
n
1
9
\(
sed
在 BRE 中,您只需用来(
匹配文字左括号。
在某些sed
实现中,您可以切换到扩展正则表达式 (ERE)(例子GNU sedwith -r
option),因此您必须使用\(
来匹配文字左括号。
答案3
正是这个原因。在这种情况下,您不应该逃避括号。
单引号'
已经告诉 shell 不要关心字符串内容,因此它按字面意思传递给 sed。转义括号是告诉 sed 将结尾\)
作为子正则表达式的分隔符。