回答:
シェルが解釈さ\$
としては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
して通常の文字として扱う必要があります。
ls \$
実行します。 \ $は$にエスケープされていないが、\\ $は\ $にエスケープされていないことがわかります。
シェルは最初にエスケープシーケンスを展開してから引数をプログラムに渡します。そのため、シェル\$
はエスケープシーケンスとして解釈し、行末に一致する単一の引数$
をに渡しgrep
ます。すべての行に終わりがあるため、すべての行が一致する必要があります:)
行末のメタキャラクターとして解釈されています。実際のドル記号と一致させたい場合は、
$ grep \\$
または
$ grep '\$'
echo \$
てからecho \\$