sed
この単純なコマンドを実行しようとしています。
sed '/VALUES\ \([0-9]/d!'
それでもエラーが発生します"RE error: parentheses not balanced"
(はい、引用符があります)。
どうですか?他のものを追加できますが、)
正規表現と一致しないことを意味します。
答え1
エスケープ文字には(
特別な意味がありますsed
。逆参照。リテラルを一致させるには、(
バックスラッシュなしで使用してください。/VALUES ([0-9]/d!
一致させたい場合は、\(
次をエスケープしてください\
。\\(
脱出(スペース)は何の違いもありません。
答え2
デフォルトでは、sed
以下を使用します。基本正規表現(BRE)。 BREでは定義に\(
使用\)
されます。サブ式:
文字ペア「(」と「)」の間にサブ式を囲むことで、BREでサブ式を定義できます。これらのサブ式は、サブ式内の固定がオプションの動作でない限り、「(」および「)」なしで一致するすべての項目と一致する必要があります。 BRE式の固定を参照してください。サブ式は任意に入れ子にすることができます。
その後、逆参照式を使用して、'\n'
andの間に含まれているサブ式と一致する同じ(空の場合もあります)文字列を一致させることができます(ここでfrom to)。ここでは左角かっこだけを使用しており、右角かっこが見つからず、エラーが発生します。\(
\)
n
1
9
\(
sed
(
BREでは、リテラルを開く括弧を一致させるだけです。
一部のsed
実装では、次のように切り替えることができます。拡張正規表現(ERE)(はいGNU sedオプションを含む)なので、リテラルを開くかっこに合わせて-r
使用する必要があります。\(
答え3
この理由です。この場合、括弧を外してはいけません。
一重引用符は'
すでにシェルに文字列の内容を気にしないように指示しているため、文字通りsedに渡されます。エスケープされた括弧は、sedに\)
末尾を子正規表現の区切り文字として扱うように指示することです。