Quando escrevo
$ grep \$
então o que eu digitar no terminal é correspondido e impresso no terminal. Como está \$
sendo interpretado?
Quando escrevo
$ grep \$
então o que eu digitar no terminal é correspondido e impresso no terminal. Como está \$
sendo interpretado?
Respostas:
O shell está interpretando \$
e passando para grep como $
o caractere de fim de linha. Supondo que sua linha tenha um fim, ela corresponderá :-)
Se você deseja corresponder a um real $
no grep, use um dos seguintes:
grep \\\$
grep '\$'
No primeiro, o shell interpreta \\
como \
e \$
como $
, dando \$
. Neste último caso, 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 as usadas em grep
caracteres especiais para alguns fins. Alguns deles 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ê deseja combinar um personagem literla que normalmente é tratado como um personagem especial, é necessário escapá-lo para que grep
ele seja tratado como o personagem normal.
ls \$
e ver que obtemos "ls: $: nenhum arquivo ou diretório", para ver que \ $ está sem escape para $, mas \\ $ está sem escape para \ $ e assim por diante.
O shell primeiro expande todas as seqüências de escape antes de passar os argumentos para o programa, então interpreta o \$
como uma sequência de escape e passa o único argumento $
para grep
, que corresponde ao final da linha. Como toda linha tem um fim, qualquer linha deve corresponder :)
man grep
; foi decidido que $
corresponde ao fim da linha, independentemente de haver ou não as linhas são separadas por \n
, \r
, ambos, ou algo completamente diferente. No caso geral, expressões regulares podem ser usadas para corresponder a qualquer string, não apenas uma "linha", e $
são usadas para corresponder ao final da string.
Está sendo interpretado como o metacaractere de fim de linha. Se você deseja corresponder a um cifrão real, faça
$ grep \\$
ou
$ grep '\$'
echo \$
e depoisecho \\$