comportamento estranho do grep no UNIX

2

Quando eu digito o comando

$ grep \\h junk  

o shell deve interpretar \\h como \h - como os dois pares de \ cada tornar-se \ . grep , por sua vez, deve interpretar \h como \h , pois \ se torna \ , então grep deve procurar o padrão \h em junk , o que está fazendo com sucesso.

Mas não está funcionando para \\$ . Por quê?

    
por Happy Mittal 16.04.2010 / 13:12

7 respostas

6

Para retornar linhas com um cifrão, outra maneira sem escapes é:

grep "[$]" file

Para encontrar linhas com o literal \$ :

grep "[\][$]" file
    
por 16.04.2010 / 13:40
2

Retorna apenas as linhas com o cifrão.

grep "\$" application/bootstrap.php

Como $ é um comando regex também (fim de linha), você tem que citar para obter as barras duplas no seu shell e no grep.

    
por 16.04.2010 / 13:32
1

O grep sempre usa \ para citar o próximo caractere, então \ h simplesmente se torna h no seu exemplo, já que \ h não é "especial":

$ cat file
\a
a

$ grep \a file
\a
a

$ grep \\a file
\a
    
por 16.04.2010 / 13:39
1

Supondo que você esteja tentando corresponder ao caractere '$', o padrão:

[$]

é a maneira mais fácil de especificá-lo sem ficar emaranhado em vários níveis de escape de caractere. Ou se você está tentando combinar os dois caracteres: '\ $', então

[\][$]

fará isso.

    
por 16.04.2010 / 22:49
1

\ h não é um escape especial para o grep, então '\ h' deve encontrar um \ h em um arquivo, o que ele faz. O shell remove o primeiro \ antes do grep vê-lo, como \ é especial (digite ls \ e ele diz ls:: Então, tal arquivo ou diretório). Portanto, para corresponder "\ h" em um arquivo, use grep \ h ou '\ h' para evitar o primeiro \ - > \ redução pelo shell.

Agora \ $: \ é reduzido para \ pelo shell, e grep vê \ $ e porque $ é especial em regexes (como +,., * etc), \ $ é um sinal literal de dólar, como um simples teste arquivo irá mostrar-lhe. Veja a man page para re_format (7). Então, isso corresponde a todas as linhas com um cifrão.

Então, se você quiser combinar um literal "\ $" em um arquivo, precisamos pensar: \ $ não é removido pelo shell para literal $, e \ to: try ls \\$' and you get "ls: \$: No such file or directory". So in grep \\ $ file , grep sees \$ and interprets that as $ again... So we want grep to see \\$ (which it will unescape again to \$), so we can put single quotes around that and avoid headaches, or escape all the special characters for the shell too: grep \\\\ $ file '. Isso funciona.

É por isso que eu quase sempre coloco aspas simples no primeiro argumento do grep, então eu só tenho que pensar sobre o que o grep fará, e não sobre o shell também.

    
por 29.07.2010 / 23:12
0

Seu shell está interpretando \ as \ e $ como o primeiro caractere de algumas seqüências de controle, como nomes de variáveis. Portanto \\ é interpretado pelo seu shell como literal \ (como você pensa), mas $ precisa ser escapado para ser interpretado como caractere literal. Use \\\\$ (sete barras invertidas) ou '\\$' (o texto em apóstrofos é interpretado literalmente por shell).

    
por 16.04.2010 / 13:31
0

Por que você não pode apenas grep '\$' ? Aspas simples impedem quase toda a interpolação.

    
por 30.07.2010 / 00:52

Tags