grep: barra invertida final

23

Quiero hacer un grep por \resources\. ¿Cómo hago esto?

He intentado:

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

Ninguno de estos trabajos .

Tom Medley
fuente
55
Use comillas simples en lugar de comillas dobles para evitar la interpretación de bash de las barras invertidas. grep '\\resources\\'
Paul Tomblin

Respuestas:

27

La barra invertida es un carácter especial para muchas aplicaciones:

  • incluido el shell: debe escapar usando otra barra invertida o más elegante, usando comillas simples cuando sea posible:

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

    Aquí el comando recibió dos argumentos con valor foo\bar, que se repitieron tal cual en el terminal.

    (Arriba, utilicé en printflugar de echotantas echoimplementaciones también hacer su propia interpretación de la barra invertida (aquí se expandiría \ben un carácter de retroceso)).

  • Pero la barra invertida también es un personaje especial para grep. Este comando reconoce muchas secuencias especiales como \(, \|, \., y así sucesivamente. De manera similar, debe alimentar grep con un doble \\para un carácter de barra invertida real. Esto significa que, utilizando el shell, debe escribir:

    grep 'foo\\bar'
    

    o equivalente:

    grep foo\\\\bar
    

    (ambas líneas le dicen al shell que transmita foo\\barcomo argumento grep).

  • Muchos otros comandos interpretan barras diagonales inversas en algunos de sus argumentos ... y se necesitan dos niveles de escape (uno para escapar de la interpretación de shell, otro para escapar de la interpretación de comando).


Por cierto, para el shell, las comillas simples '…'evitan cualquier tipo de interpretación de caracteres, pero las comillas dobles solo evitan algunas de ellas: en particular $, `y \siguen siendo caracteres activos dentro "…".

Stéphane Gimenez
fuente
18

También puede usar fgrep(que es solo grepcon la -Fbandera). Esto obliga a grep a interpretar el patrón como una cadena fija (es decir, tratará a \como un literal \). Aún necesitará proteger las barras invertidas de la expansión del caparazón.

grep -F '\resources\'
mills013
fuente
¡La bandera está ahí por una razón! Estaba tratando de buscar ..\e incluso con '..\\'no obtuve los resultados que quería. grep -F '..\'me consiguió lo que quería! Gracias
FreeSoftwareServers
.. ¡Intenta formatear ese comentario correctamente! -> meta.stackexchange.com/questions/201663/…
FreeSoftwareServers
3

greprequiere cuatro barras invertidas para representar una barra invertida:

grep "\\\\resources\\\\"
Tom Medley
fuente
12
Esta es una simplificación excesiva bastante engañosa. grepsolo requiere 1 barra invertida para escapar de otra barra invertida, pero el shell también requiere que se cite la barra invertida. Las comillas dobles ( ") NO hacen comillas invertidas, pero sí la barra invertida, por lo que las comillas dobles en su ejemplo no hacen nada y las 4 barras invertidas son necesarias en su lugar.
jw013
Tuve que usar cuatro barras diagonales inversas en Windows a pesar de que el símbolo del sistema de Windows no trata las barras diagonales inversas como * nix. Me pregunto si los puertos GnuWin malinterpretaron el efecto del shell y codificaron un requisito de 4 barras diagonales, pensando que era lo que se requería grep.
Synetech