Por que tenho que escapar de um "ponto" duas vezes?

13

Eu sei que podemos escapar de um caractere especial como *(){}$com \para ser considerado literal.
Por exemplo \*ou\$

Mas no caso de .eu ter que fazê-lo duas vezes, \\.caso contrário, é considerado caráter especial. Exemplo:

man gcc | grep \\.

Por que é tão?

Usuário Registrado
fonte
Você pode dizer que você tem que escapar duas vezes?
cuonglm
man bash|grep \\.poderia ser um exemplo.
Usuário registrado
3
Mais precisamente, você não escapar ponto duas vezes, você escapar o caractere de escape para que ele seja passado para grep
Cthulhu
5
Você pode usar aspas para evitar escapar caracteres de barra invertida: man gcc | grep '\.'.
Leonid Beschastny
1
Eu prefiro fortemente @ sugestão de LeonidBeschastny por causa de quanto mais claro é o que está acontecendo
Izkata

Respostas:

24

Geralmente, você só precisa escapar uma vez para tornar o caractere especial considerado literal. Às vezes, você precisa fazer isso duas vezes, porque seu padrão é usado por mais de um programa.

Vamos discutir seu exemplo:

man gcc | grep \\.

Este comando é interpretado por dois programas, bashintérprete e grep. A primeira causa de escape bashsabe \é literal, então a segunda é aprovada grep.

Se você escapar apenas uma vez, \., bashsaberá que este ponto é literal, e passar .para grep. Quando grepvê isso ., ele acha que o ponto é um caractere especial, não literal.

Se você escapar duas vezes, bashpassará o padrão \.para grep. Agora grepsaiba que é um ponto literal.

cuonglm
fonte
: Então, o caractere de escape para dot depende do número de pipes que usamos? .Por exemplo cmd | cmd | cmd | cmd \\\\. Isso está correto ????
Thushi
6
@Thushi: Não. Isso não tem nada a ver com o fato de você estar usando um (ou vários) caracteres de pipe, mas se aplica mesmo grep \\. my_file. A linha de comando é interpretada pelo shell, usando o primeiro \ para escapar do segundo, para que um \ seja passado literalmente para grep. O ponto .não é especial para o shell, portanto é transmitido literalmente de qualquer maneira. O Grep então lê o (single) \ e o usa para escapar do ponto ..
Ansgar Esztermann
@AnsgarEsztermann: de Yes.That true.Checked it.Thanks :)
Thushi
2
Acredito que a resposta seja um tanto incorreta, pois diz "A primeira causa de escape que o bash sabe. É literal, a segunda é para grep". Na verdade, a primeira fuga permite que o bash saiba que \ é letal e passe \. para grep.
Cthulhu
@ Gnouc eu não acho que tem. echo .na festança apenas ... ecoa o .caráter de Bach .
Cthulhu