Genau.Huo hat geschrieben:29.04.2022 14:50:17Als ich egrep "\\\\\\\\" auf einen Quelltext loslies, merkte ich zu meiner anfänglichen Verblüffung, dass doppelte literale Backslashes (\\) gematcht werden. Dafür benötigt man acht Backslashes?Meillo hat geschrieben:28.04.2022 20:47:06Wenn man die RE direkt als Kommandozeilenargument angibt wird es etwas schwieriger. Wie waere es beispielsweise mit:Auf was matcht das? Und wie sieht die gleiche RE aus wenn man sie in eine Datei schreibt und diese mit `-f' nutzt?Code: Alles auswählen
egrep "\\\\\\\\"
Sehr gut! Das ist das richtige Denken dafuer.Huo hat geschrieben:29.04.2022 14:50:17Nach einiger Tüftelei erkläre ich mir dies folgendermaßen:
Aus Sicht der Shell handelt es sich bei den acht Backslashes um vier literale Backslashes, da ein Paar von Escapezeichen, wie in der zweiten Lektion gelernt, jeweils für das literale Zeichen steht (gilt wohl auch hier, auch wenn es dabei nicht um REs geht).
An egrep werden also vier Backslash-Zeichen übergeben. Das sind nun also zwei Escapezeichen-Paare, was zwei literalen Backslashes entspricht. q.e.d.
Wenn man sehen will, was die Shell tatsaechlich an egrep uebergibt, kann man `set -x' aufrufen, dann gibt die Shell aus was sie aufruft:
Code: Alles auswählen
:-Q set -x
:-Q egrep "\\\\\\\\"
+ egrep \\\\
(Blau sind die Escapes, die die Shell entfernt. Schwarz sind die literalen Backslashes ... aus Sicht der Shell.):-Q egrep "\\\\\\\\"
+ egrep \\\\
Hier zum Vergleich und als Ergaenzung mal noch mit keinem bzw. Single-Quote-Escaping:
Code: Alles auswählen
:-Q egrep \\\\\\\\
+ egrep \\\\
:-Q egrep '\\\\\\\\'
+ egrep \\\\\\\\
Nun schauen wir uns die Situation aus Sicht von egrep an. Dieses bekommt vier Backslashes uebergeben:
Code: Alles auswählen
egrep \\\\
... und uebrig bleiben zwei schwarze Backslashes, die egrep dann literal matcht.egrep \\\\
Ich finde es (nicht nur bei Datenstrukturen mit Pointern) oft hilfreich, mir die Dinge auf Papier hinzumalen und mit Farben Ordnung in den Zeichenwust zu bringen.