web-dev-qa-db-ja.com

「$」という文字を含む文字列をgrepと照合する方法

$文字を含む文字列を一致させる方法は?

例-次の場合grepは一致を返しません。

  param="ambari_parameter$"
  echo "ambari_parameter$" | grep $param
  echo "ambari_parameter$" | grep "$param"
8
yael

この場合、$paramの文字列は正規表現として解釈されます。この式には、パターン内の$を一致の最後に固定するambari_parameterが含まれています。入力データのambari_parameter$には、最後のambari_parameterが含まれていないため(文字列の最後の$により)、一致しません。

パターン内で$\$としてエスケープするか(二重引用符で囲まれた文字列内の\\$)、または$[$]として括弧内に配置します。ただし、正規表現の一致ではなく文字列の一致を実行する必要があるため、-Fを使用する方が適切な場合があります。

echo 'ambari_parameter$' | grep -F -e "$param"

grep -Fを使用すると、grepは指定されたパターンを正規表現ではなく文字列として扱います。したがって、パターンの各文字は、末尾の$であっても、文字どおり一致します。

また、ここで-eを使用して、grepに次の引数をパターンとして認識させました。これは、$paramがダッシュ(-)で始まる場合に必要です。一致するパターンが変数で指定されている場合は常に-eを使用することをお勧めします。

whole入力行が完全な文字列と一致することをさらに要求するには、-xを追加します。

echo 'ambari_parameter$' | grep -xF -e "$param"

$paramambari_parameter$の場合、これは文字列_ambari_parameter$またはambari_parameter$100とは一致しません(ただし、-xが残っている場合はwillと一致します)でる)。

14
Kusalananda

パターン全体を文字通り照合したい場合は それを正規表現として扱わないでくださいdoが正規表現のリテラル$と一致する必要がある場合は、\$を使用します。

.\、およびその他のいくつかの句読文字と同様に、$は正規表現では メタ文字 です。 $文字は 行の最後の空の文字列 に一致します(つまり、x$xに一致しますが、行の最後にのみ一致します)。パターンにanyメタ文字が含まれていない場合、それを正規表現として扱う必要はなく、grep -Fを使用する必要があります Kusalanandaが説明しているように

If正規表現で文字どおり$またはその他のメタ文字に一致する必要がある場合は、\でエスケープします。メタキャラクター。リテラルと一致するには$書き込み\$、リテラルと一致するには\書き込み\\など。

param='ambari_parameter\$'
echo "ambari_parameter$" | grep "$param"

シェルでparamに割り当てる場合は、上記のように正規表現を一重引用符('')で囲みます。これは、$\もすべてのBourneスタイルのシェルを含むほとんどのシェルで特別な意味があります(タグ付けした bash )。 \ in shells は、基本的に正規表現と同じように機能します。 ($は使用しません。さまざまな シェル拡張/置換 、特に パラメータ拡張 )に使用されます。

引用符で囲まれていない、または 二重引用符 の場合でも、\$はシェルでリテラル$を示し、次にgrep$として渡されます。 grepは、正規表現のメタ文字として解釈されます。一重引用符で囲むと、これを防ぐことができます。あるいは、\\\$--または\\$--と書くこともできますが、それは混乱を招きます。

8
Eliah Kagan

次の方法で完全に一致するものを探している場合は、特殊文字をエスケープする必要があります。

単一引用符で囲まれている場合は、1つのエスケープが必要です。

grep 'parameter\$'

二重引用符で囲まれている場合、または引用符で囲まれていない場合は、1つエスケープする必要があります。

grep "parameter\\$" #or
grep parameter\\$

引用符で囲まれていない場合、match内のスペースもエスケープする必要があることに注意してください。

grep para\ meter\\$
2
αғsнιη