Quando escrevo
$ grep \$
então o que eu digitar no terminal é correspondido e impresso no terminal. Como está \$
sendo interpretado?
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.
echo \$
e depoisecho \\$
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$
paragrep
, que corresponde ao final da linha. Como toda linha tem um fim, qualquer linha deve corresponder :)fonte
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
ou
fonte
^
é para o início da string e$
para o final.ou
corresponderá a todas as strings; portanto, qualquer coisa que você digitar será repetida.
Experimentar
Agora, apenas as seqüências cujo último caractere
a
será correspondido e ecoado .fonte
Você pode salvar o problema de escapar se quiser procurar um literal
$
, usando a expressão regular para a classe de caracteres. Por exemplo,fonte