Como \ $ está sendo interpretado pelo grep?


Respostas:


18

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.


1
para testar o que grep vê, tente echo \$e depoisecho \\$

No grep \\\ $, como você disse, \ $ é passado para o grep, para que ele corresponda às cadeias que contêm \ $, mas por que ele corresponde às cadeias que contêm apenas um $?

Porque $ in grep significa um fim de linha. Para combinar com o caractere $, você precisa escapar dele para que o grep não o trate especialmente. Veja minha atualização.

@ Pasi: echo faz sua própria falta de escape, dependendo se é um shell embutido ou não, compatível com POSIX ou não, etc. Melhor é (IMHO) usar 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.
Henno 29/07

5

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 :)


Mas como $ é o fim da linha? O fim da linha não é \ n?

2
@ Happy Mithal: Veja 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.

2

Está sendo interpretado como o metacaractere de fim de linha. Se você deseja corresponder a um cifrão real, faça

 $ grep \\$ 

ou

 $ grep '\$' 

1

^é para o início da string e $para o final.

grep \$

ou

grep $

corresponderá a todas as strings; portanto, qualquer coisa que você digitar será repetida.

Experimentar

grep a$

Agora, apenas as seqüências cujo último caractere aserá correspondido e ecoado .


1

Você pode salvar o problema de escapar se quiser procurar um literal $, usando a expressão regular para a classe de caracteres. Por exemplo,

$ grep '[$]' file
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.