このシンプルなsed
コマンドを実行しようとしています
sed '/VALUES\ \([0-9]/d!'
それでも"RE error: parentheses not balanced"
(はい、引用符があります)。
私に何ができる?つまり、別の)
しかし、それは私の正規表現と一致しません。
エスケープされた(
はsed
で特別な意味を持ちます。これは back-references に使用されます。リテラル(
に一致させるには、バックスラッシュなしで使用します:/VALUES ([0-9]/d!
\(
と一致させようとしている場合は、代わりに\
をエスケープしてください:\\(
(スペース)をエスケープしても違いはありません。
デフォルトでは、sed
は 基本正規表現(BRE) を使用します。 BREでは、\(
および\)
は subexpression の定義に使用されます。
部分式は、文字ペア "("と ")"で囲むことにより、BRE内で定義できます。このような部分式は、「(」と「)」なしで一致したものと一致しますが、部分式内でのアンカーはオプションの動作です。 BRE式のアンカーを参照してください。部分式は任意にネストできます。
次に、後方参照式'\n'
を使用して、\(
と\)
で囲まれた部分式によって一致したのと同じ(空の場合もある)文字列に一致します。ここで、n
1
から9
まで。ここでは、左括弧のみを使用します\(
、sed
は右括弧を見つけることができず、エラーが発生します。
BREでは、(
を使用して、リテラルの左括弧を照合します。
一部のsed
実装では、 拡張正規表現(ERE) (例 GNU sed with -r
opstion)に切り替えることができるので、 \(
を使用して、リテラルの左括弧と一致させます。
これがまさに理由です。この場合、括弧をエスケープしないでください。
単一引用符'
はすでにシェルに文字列の内容を気にしないように指示しているので、文字通りsedに渡されます。括弧をエスケープすると、sedに\)
サブ正規表現の区切り文字として。