Innanzitutto, nota che la singola barra corrisponde troppo:
$ echo $'eegg \n e.g.' | grep e\.g\.
eegg
e.g.
Per quanto riguarda Bash , un periodo di fuga è uguale a un periodo. Bash passa il periodo a grep . Per grep, un punto corrisponde a qualsiasi cosa.
Ora, considera:
$ echo $'eegg \n e.g.' | grep e\\.g\\.
e.g.
$ echo $'eegg \n e.g.' | grep e\\\.g\\\.
e.g.
$ echo $'eegg \n e.g.' | grep e\\\\.g\\\\.
$
Quando Bash vede una doppia barra, la riduce in una singola barra e la passa su grep che, nella prima delle tre prove precedenti, vede, come vogliamo, una singola barra prima di un punto. Quindi, questo fa la cosa giusta.
Con una tripla barra, Bash riduce i primi due a una singola barra. Quindi vede \.
. Poiché un periodo di escape non ha un significato speciale per Bash, questo è ridotto a un periodo normale. Il risultato è che grep vede, come vogliamo, una barra prima di un punto.
Con quattro barre, Bash riduce ciascuna coppia in una singola barra. Bash passa a grep due barre e un punto. grep vede le due barre e un punto e riduce le due barre a una singola barra letterale . A meno che l'input non abbia una barra letterale seguita da qualsiasi carattere, non ci sono corrispondenze.
Per illustrare quest'ultimo, ricorda che all'interno delle virgolette singole, tutti i caratteri sono letterali. Pertanto, date le seguenti tre righe di input, il comando grep corrisponde solo sulla riga con la barra letterale nell'input:
$ echo 'eegg
e.g.
e\.g\.' | grep e\\\\.g\\\\.
e\.g\.
Riepilogo del comportamento di Bash
Per Bash, le regole sono
Due barre vengono ridotte a una singola barra.
Una barra davanti a un personaggio normale, come un punto, è solo il personaggio normale (punto).
Così:
$ echo \. \\. \\\. \\\\.
. \. \. \\.
C'è un modo semplice per evitare tutta questa confusione: sulla riga di comando di Bash, le espressioni regolari dovrebbero essere racchiuse tra virgolette singole. All'interno di virgolette singole, Bash lascia tutto da solo.
$ echo '\. \\. \\\. \\\\.' # Note single-quotes
\. \\. \\\. \\\\.
\\\.
e dato grep,\.
ma non è così. bella domanda