私が書くとき
$ grep \$
次に、端末で入力したものがすべて一致し、端末に印刷されます。 \$
はどのように解釈されますか?
Shellは、\$
を解釈し、それを行末文字である$
としてgrepに渡します。したがって、行に終わりがあると仮定すると、一致します:-)
Grepで実際の$
を照合する場合は、次のいずれかを使用します。
grep \\\$
grep '\$'
前者では、シェルは\\
を\
として解釈し、\$
を$
として解釈して、\$
を与えます。後者では、それはまったく解釈されません。
\$
が2文字のシーケンスではなくドル記号と一致する理由についての質問については、grep
で使用されるような正規表現はいくつかの目的で特殊文字を使用します。それらのいくつかは次のとおりです。
$ end of line
^ start of line
. any character
+ 1 or more of the preceeding pattern
* 0 or more of the preceeding pattern
{n,m} between n and m of the preceeding pattern
[x-y] any character between x and y (such as [0-9] for a digit).
他の多くと一緒に。
通常は特殊文字として扱われるリテラ文字と一致させたい場合は、grep
が通常の文字として扱うようにエスケープする必要があります。
シェルは、プログラムに引数を渡す前に、最初にエスケープシーケンスを展開するため、\$
をエスケープシーケンスとして解釈し、単一の引数$
を最後に一致するgrep
に渡します。行の。すべての行に終わりがあるので、どの行も一致する必要があります:)
これは、行末のメタ文字として解釈されています。実際のドル記号と一致させたい場合は、
$ grep \\$
または
$ grep '\$'
^
は文字列の開始用で、$
終わりのために。
grep \$
または
grep $
すべての文字列に一致するため、入力したものはすべてエコーバックされます。
試してみてください
grep a$
さて、最後の文字がa
である文字列のみが一致してエコーされます。
文字クラスの正規表現を使用することで、リテラル$
を検索する場合に、エスケープの手間を省くことができます。例えば、
$ grep '[$]' file