¿Por qué tengo que escapar un "punto" dos veces?

13

Sé que podemos escapar de un personaje especial como *(){}$con el \fin de ser considerados literales.
Por ejemplo \*o\$

Pero en caso de .que tenga que hacerlo dos veces, de lo \\.contrario se considera un carácter especial. Ejemplo:

man gcc | grep \\.

¿Por que es esto entonces?

usuario registrado
fuente
¿Puedes dar el caso de que tienes que escapar dos veces?
Cuonglm
man bash|grep \\.Podría ser un ejemplo.
Usuario registrado
3
Más precisamente, no escapas de punto dos veces, escapas del personaje de escape para que pase a grep
Cthulhu
55
Se podría utilizar comillas para evitar el escape de caracteres de barra invertida: man gcc | grep '\.'.
Leonid Beschastny
1
Prefiero fuertemente la sugerencia de @ LeonidBeschastny debido a lo mucho más claro que es lo que está sucediendo
Izkata

Respuestas:

24

En general, solo tiene que escapar una vez para que el carácter especial se considere literal. En algún momento tienes que hacerlo dos veces, porque tu patrón es usado por más de un programa.

Deje que discuta su ejemplo:

man gcc | grep \\.

Este comando es interpretado por dos programas, bashintérprete y grep. La primera causa de escape bashsabe \es literal, por lo que la segunda es pasar grep.

Si a escapar de una sola vez, \., bashsabrá este punto es literal, y pasar .a grep. Cuando grepvea esto ., piensa que el punto es un carácter especial, no literal.

Si escapa dos veces, bashpasará el patrón \.a grep. Ahora grepsepa que es un punto literal.

Cuonglm
fuente
: Entonces, ¿el carácter de escape para punto depende de la cantidad de tuberías que usamos? Por ejemplo, cmd | cmd | cmd | cmd \\\\. ¿¿¿¿Es eso correcto????
Thushi
66
@Thushi: No. Esto no tiene nada que ver con el hecho de que estás usando una (o varias) letras de caracteres, pero aplica incluso para grep \\. my_file. La línea de comandos es interpretada por el shell, utilizando el primero \ para escapar del segundo, por lo que uno \ se pasa literalmente a grep. El punto .no es especial para el shell, por lo que se pasa literalmente de todos modos. Grep luego lee el (single) \ y lo usa para escapar del punto ..
Ansgar Esztermann
@AnsgarEsztermann: Sí, eso es verdad, lo revisé, gracias :)
Thushi
2
Creo que la respuesta es algo incorrecta, ya que dice "El primer escape causa que bash sabe. Es literal, el segundo es para grep". En realidad, el primer escape le permite a bash saber que \ es leteral y pasar \. grep.
Cthulhu
@Gnouc, no creo que lo haya hecho. echo .en la fiesta solo ... hace eco del .personaje de bach .
Cthulhu