リテラルドル記号を含む正規表現でripgrepを使用する

リテラルドル記号を含む正規表現でripgrepを使用する

次の内容を含むスクリプトがあるとします。

VAR=${VAR1%.*}

私は次のコマンドを探しています

rg "${.*%"

探したかったけど近くに行けませんでした。

すべて失敗しました

rg "\$\{.\*%"
rg \$\{.\*%
rg "\$\{.*%"
rg \$\{.*%

答え1

$\正規表現、およびシェルに特別です(後者の二重引用符を含む)。{場合によっては、シェルにのみ適用され、リストはシェルによって異なります。

実際、多くの正規表現演算子(、、、、、、、、、、、、*少なくとも)もシェル構文で特別?です(|{}()\^$[]一部シェルに関係なく)、したがって正規表現を一重引用符で囲むことをお勧めします。ほとんどのシェルでは、すべての文字が特別な意味を失います(存在する場合)。

だから:

rg '\$\{.*%'

'...'脱出する場所みんなシェルの文字(ここで\(参照演算子)、$(拡張演算子)、*(glob演算子)は特殊で、時には%(作業拡張演算子))がエスケープされ正規表現です\${

または:

rg '[$][{].*%'

rg最新の拡張正規表現の特殊演算子に似た正規perl表現を理解します。{x,y}しかし注意すべき点は基本的なgrep-E// -P/がなければ-A/と理解される正規表現は特別ではありませんが、-X特別です!だからあなたはする必要があります{}\{\}いいえ{/をエスケープして}文字通り処理します(またはgrepデフォルトではsed// ed/ ex... vi)。

正規表現を次のように変更する必要があります。

rg '\$\{[^}]*%'

内部一致を避けるために.(すべての単一文字と一致)を[^}](を除くすべての単一文字と一致)に置き換えます。}

もの${foo}は20%です。${bar}商品よりも安い

例えば。

あなたの試みを見てください。

  • rg "\$\{.\*%"rg '$\{.\*%'、これは特別な意味を排除するためにそれを\使用するほとんどのシェルと同じです。この文字は二重引用符で囲まれた特殊文字ではないため、前に$保持してください。\{*
  • rg \$\{.\*%、と同じですrg '${.*%'\引用符の外側には別の引用演算子があります。 (改行、時には特別な場合)\xと同じです。シェルでは、、、、...エスケープシーケンスで使用することもできます。'x'`!fish\\n\t\a\377
  • rg "\$\{.*%"、のようなrg '$\{.*%'、非常に近い
  • rg \$\{.*%悪いのは、ワイルドカードが引用されていないため、シェルがワイルドカードを現在の作業ディレクトリから名前が始まり、終了するファイルのリストに拡張できるためです*${%

関連情報