grep: barra invertida à direita

23

Eu quero fazer um grep para \resources\. Como eu faço isso?

Eu tentei:

grep \resources\
grep \\resources\\
grep "\resources\"
grep "\\resources\\"

Nenhum desses trabalhos .

Tom Medley
fonte
5
Use aspas simples em vez de aspas duplas para evitar a interpretação do bash das barras invertidas. grep '\\resources\\'
Paul Tomblin

Respostas:

27

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 printfvez de echotantas echoimplementações, também fazer sua própria interpretação da barra invertida (aqui seria expandida \bpara 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\\barcomo 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 "…".

Stéphane Gimenez
fonte
18

Você também pode usar fgrep(que é apenas grepcom a -Fbandeira). 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\'
mills013
fonte
A bandeira está lá por uma razão! Eu estava tentando cumprimentar ..\e, mesmo '..\\'assim, não obtive os resultados desejados. grep -F '..\'conseguiu o que eu queria! Obrigado
FreeSoftwareServers
.. Tente formatar esse comentário corretamente! -> meta.stackexchange.com/questions/201663/...
FreeSoftwareServers
3

greprequer quatro barras invertidas para representar uma barra invertida:

grep "\\\\resources\\\\"
Tom Medley
fonte
12
Essa é uma simplificação excessivamente enganosa. greprequer 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.
Jw013
Eu tive que usar quatro barras invertidas no Windows, mesmo que o prompt de comando do Windows não trate as barras invertidas como o * nix. Gostaria de saber se as portas do GnuWin não entenderam o efeito do shell e codificaram um requisito de 4 barras, pensando que era o que era exigido grep.
Synetech 25/12/15