Eu quero fazer um grep para \resources\
. Como eu faço isso?
Eu tentei:
grep \resources\
grep \\resources\\
grep "\resources\"
grep "\\resources\\"
Eu quero fazer um grep para \resources\
. Como eu faço isso?
Eu tentei:
grep \resources\
grep \\resources\\
grep "\resources\"
grep "\\resources\\"
Respostas:
A barra invertida é um caractere especial para muitos aplicativos:
incluindo o shell: é necessário escapá-lo usando outra barra invertida ou mais elegante, usando aspas simples quando possível:
$ printf '%s\n' foo\\bar 'foo\bar'
foo\bar
foo\bar
Aqui, o comando recebeu dois argumentos com valor foo\bar
, que foram ecoados no terminal.
(Acima, eu usei, em printf
vez de echo
tantas echo
implementações, também fazer sua própria interpretação da barra invertida (aqui seria expandida \b
para um caractere de backspace)).
Mas a barra invertida também é um caractere especial para grep
. Este comando reconhece muitas seqüências especiais, como \(
, \|
, \.
e assim por diante. Da mesma forma, você precisa alimentar grep com um duplo \\
para um caractere de barra invertida real. Isso significa que, usando o shell, você precisa digitar:
grep 'foo\\bar'
ou equivalente:
grep foo\\\\bar
(as duas linhas dizem ao shell para transmitir foo\\bar
como argumento grep
).
Muitos outros comandos interpretam barras invertidas em alguns de seus argumentos ... e são necessários dois níveis de escape (um para escapar da interpretação do shell, outro para escapar da interpretação do comando).
A propósito, para o shell, aspas simples '…'
impedem qualquer tipo de interpretação de caracteres, mas aspas duplas apenas evitam algumas delas: em particular $
, `
e \
permanecem caracteres ativos "…"
.
Você também pode usar fgrep
(que é apenas grep
com a -F
bandeira). Isso força o grep a interpretar o padrão como uma string fixa (isto é, tratará a \
como um literal \
). Você ainda precisará proteger as barras invertidas da expansão pelo shell.
grep -F '\resources\'
..\
e, mesmo '..\\'
assim, não obtive os resultados desejados. grep -F '..\'
conseguiu o que eu queria! Obrigado
grep
requer quatro barras invertidas para representar uma barra invertida:
grep "\\\\resources\\\\"
grep
requer apenas 1 barra invertida para escapar de outra barra invertida, mas o shell também exige que sejam citadas barras invertidas. As aspas duplas ( "
) NÃO citam barras invertidas, mas a barra invertida, e é por isso que as aspas duplas no seu exemplo não fazem nada e as 4 barras invertidas são necessárias.
grep
.
grep '\\resources\\'