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 grepcaracteres 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 grepele 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 \\$