Quiero hacer un grep por \resources\
. ¿Cómo hago esto?
He intentado:
grep \resources\
grep \\resources\\
grep "\resources\"
grep "\\resources\\"
Quiero hacer un grep por \resources\
. ¿Cómo hago esto?
He intentado:
grep \resources\
grep \\resources\\
grep "\resources\"
grep "\\resources\\"
Respuestas:
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 printf
lugar de echo
tantas echo
implementaciones también hacer su propia interpretación de la barra invertida (aquí se expandiría \b
en 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\\bar
como 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 "…"
.
También puede usar fgrep
(que es solo grep
con la -F
bandera). 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\'
..\
e incluso con '..\\'
no obtuve los resultados que quería. grep -F '..\'
me consiguió lo que quería! Gracias
grep
requiere cuatro barras invertidas para representar una barra invertida:
grep "\\\\resources\\\\"
grep
solo 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.
grep
.
grep '\\resources\\'