Beachten Sie zunächst, dass der einzelne Schrägstrich zu stark übereinstimmt:
$ echo $'eegg \n e.g.' | grep e\.g\.
eegg
e.g.
Für Bash ist eine entkommene Periode dieselbe wie eine Periode. Bash gibt die Periode an grep weiter . Für grep passt ein Punkt zu allem.
Betrachten Sie nun:
$ 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\\\\.
$
Wenn Bash einen doppelten Schrägstrich sieht, reduziert er ihn auf einen einzelnen Schrägstrich und gibt diesen an grep weiter, der im ersten der drei obigen Tests, wie wir wollen, einen einzelnen Schrägstrich vor einem Punkt sieht. Das macht also das Richtige.
Mit einem dreifachen Schrägstrich reduziert Bash die ersten beiden auf einen einzigen Schrägstrich. Es sieht dann \.
. Da eine entkommene Periode für Bash keine besondere Bedeutung hat, wird dies auf eine einfache Periode reduziert. Das Ergebnis ist, dass grep, wie wir wollen, vor einer Periode einen Schrägstrich sieht.
Mit vier Schrägstrichen reduziert Bash jedes Paar auf einen einzigen Schrägstrich. Bash gibt zwei Schrägstriche und einen Punkt weiter. grep sieht die zwei Schrägstriche und einen Punkt und reduziert die beiden Schrägstriche auf einen einzigen wörtlichen Schrägstrich. Sofern die Eingabe keinen wörtlichen Schrägstrich gefolgt von einem Zeichen enthält, gibt es keine Übereinstimmungen.
Denken Sie zur Veranschaulichung daran, dass in einfachen Anführungszeichen alle Zeichen wörtlich sind. In Anbetracht der folgenden drei Eingabezeilen stimmt der Befehl grep nur in der Zeile mit dem wörtlichen Schrägstrich in der Eingabe überein:
$ echo 'eegg
e.g.
e\.g\.' | grep e\\\\.g\\\\.
e\.g\.
Zusammenfassung von Bashs Verhalten
Für Bash gelten die Regeln
Somit:
$ echo \. \\. \\\. \\\\.
. \. \. \\.
Es gibt eine einfache Möglichkeit, all diese Verwirrung zu vermeiden: In der Bash-Befehlszeile sollten reguläre Ausdrücke in einfache Anführungszeichen gesetzt werden. In einfachen Anführungszeichen lässt Bash alles in Ruhe.
$ echo '\. \\. \\\. \\\\.' # Note single-quotes
\. \\. \\\. \\\\.
\\\.
und geben,\.
aber das tut es nicht. gute Frage