次の内容を含むスクリプトがあるとします。
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 \$\{.*%
悪いのは、ワイルドカードが引用されていないため、シェルがワイルドカードを現在の作業ディレクトリから名前が始まり、終了するファイルのリストに拡張できるためです*
。${
%