Como o \ $ está sendo interpretado pelo grep?

12

Quando escrevo

$ grep \$  

então o que eu digitar no terminal, é combinado e impresso no terminal. Como o \$ está sendo interpretado?

    
por Happy Mittal 15.04.2010 / 14:45

5 respostas

18

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.

    
por 15.04.2010 / 14:50
5

O shell primeiro expande qualquer seqüência de escape antes de passar os argumentos para o programa, então interpreta o \$ como uma seqüência de escape e passa o único argumento $ para grep , que corresponde ao fim da linha. Como cada linha tem um fim, qualquer linha deve corresponder:)

    
por 15.04.2010 / 14:50
2

Está sendo interpretado como o metacaractere de fim de linha. Se você quiser combinar um sinal de dólar real, faça

 $ grep \$ 

ou

 $ grep '\$' 
    
por 15.04.2010 / 14:50
1

^ é para o início da sequência e $ para o final.

grep \$

ou

grep $

corresponderá a cada string, então qualquer coisa que você digitar será exibida novamente.

Tente

grep a$

Agora, apenas strings cujo último caractere é a será correspondido e ecoado .

    
por 15.04.2010 / 14:51
1

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

$ grep '[$]' file
    
por 15.04.2010 / 15:28