RegExp-Kurs 03: egrep

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: RegExp-Kurs 03: egrep

Beitrag von Meillo » 08.05.2022 11:52:14

Huo hat geschrieben: ↑ zum Beitrag ↑
29.04.2022 14:50:17
Meillo hat geschrieben: ↑ zum Beitrag ↑
28.04.2022 20:47:06
Wenn man die RE direkt als Kommandozeilenargument angibt wird es etwas schwieriger. Wie waere es beispielsweise mit:

Code: Alles auswählen

egrep "\\\\\\\\"
Auf was matcht das? Und wie sieht die gleiche RE aus wenn man sie in eine Datei schreibt und diese mit `-f' nutzt?
Als 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? 8O
Genau. ;-)
Huo hat geschrieben: ↑ zum Beitrag ↑
29.04.2022 14:50:17
Nach 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. :wink:
Sehr gut! Das ist das richtige Denken dafuer. :THX:


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 \\\\
Hier habe ich mal die Backslashes in der Shell nach Escapezeichen und literalen Zeichen getrennt:
:-Q egrep "\\\\\\\\"
+ egrep \\\\
(Blau sind die Escapes, die die Shell entfernt. Schwarz sind die literalen Backslashes ... aus Sicht der Shell.)

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 \\\\
Hier markiere ich nun in Gruen die Escapezeichen fuer egrep:
egrep \\\\
... und uebrig bleiben zwei schwarze Backslashes, die egrep dann literal matcht.



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. ;-)
Use ed once in a while!

Antworten