Para retornar linhas com um cifrão, outra maneira sem escapes é:
grep "[$]" file
Para encontrar linhas com o literal \$
:
grep "[\][$]" file
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ê?
Para retornar linhas com um cifrão, outra maneira sem escapes é:
grep "[$]" file
Para encontrar linhas com o literal \$
:
grep "[\][$]" file
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.
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
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.
\ 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.
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 que você não pode apenas grep '\$'
? Aspas simples impedem quase toda a interpolação.