O shell está interpretando o \$
e passando para o grep como $
, o caractere de fim de linha. Portanto, supondo que sua linha tenha um fim, ela corresponderá: -)
Se você quiser corresponder um $
real no grep, use um dos seguintes:
grep \\$
grep '\$'
No primeiro, o shell interpreta \
como \
e \$
como $
, fornecendo \$
. No segundo, não o interpreta.
Quanto à sua pergunta sobre por que \$
corresponde ao cifrão e não à sequência de dois caracteres, expressões regulares como aquelas usadas em grep
usam caracteres especiais para alguns propósitos. Algumas delas são:
$ 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).
junto com muitos outros.
Quando você quer combinar um personagem litera que normalmente é tratado como um caractere especial, você precisa escapar para que grep
o trate como o caractere normal.