grep: Trailing de barra invertida

19

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

Eu tentei:

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

Nada disso funciona .

    
por Tom Medley 09.02.2012 / 18:19

3 respostas

24

A barra invertida é um caractere especial para muitas aplicações:

  • incluindo o shell: você precisa escapar usando outra barra invertida ou mais elegantemente, usando aspas simples quando possível:

    $ printf '%s\n' foo\bar 'foo\bar'
    foo\bar
    foo\bar
    

    Aqui o comando recebeu dois argumentos com o valor foo\bar , que foram ecoados como estão no terminal.

    (Acima, usei printf em vez de echo , já que muitas implementações de echo também fazem sua própria interpretação de barra invertida (aqui expandiria \b em um caractere de retrocesso)).

  • Mas a barra invertida também é um caractere especial para grep . Este comando reconhece muitas seqüências especiais como \( , \| , \. e assim por diante. Assim, da mesma forma, você precisa alimentar o grep com um \ duplo para um caractere real de barra invertida. Isso significa que, usando o shell, você precisa digitar:

    grep 'foo\bar'
    

    ou equivalentemente:

    grep foo\\bar
    

    (ambas as linhas dizem ao shell para transmitir foo\bar como argumento para grep ).

  • Muitos outros comandos interpretam barras invertidas em alguns de seus argumentos ... e dois níveis de escape são necessários (um para escapar da interpretação do shell, um para escapar da interpretação do comando).

A propósito, para o shell, aspas simples '…' previnem qualquer tipo de interpretação de caracteres, mas aspas duplas apenas previnem algumas delas: em particular $ , ' e \ permanecem caracteres ativos em "…" .

    
por 09.02.2012 / 18:40
17

Você também pode usar fgrep (que é apenas grep com o -F flag). Isso força o grep a interpretar o padrão como uma string fixa (ou seja, ele tratará um \ como um literal \ ). Você ainda precisará proteger as barras invertidas da expansão pelo shell.

grep -F '\resources\'
    
por 09.02.2012 / 18:38
3

grep requer quatro barras invertidas para representar uma barra invertida:

grep "\\resources\\"
    
por 09.02.2012 / 18:22