Vergleich Shell-Globbing mit Regulären Ausdrücken
(C) 2008 T.Birnthaler/H.Gottschalk <howtos(at)ostc.de>
OSTC GmbH, www.ostc.de
$Id: shell-glob-regex-cmp-HOWTO.txt,v 1.7 2008-12-22 15:39:07 tsbirn Exp $
Dieses Dokument beschreibt die Unterschiede und Gemeinsamkeiten des "Shell-
Globbing" (d.h. den Shell-Mustern zur Dateinamen-Expansion) und der "Regulären
Ausdrücken" (d.h. den Mustern zur Texterkennung und Ersetzung in Programmen).
1) Einführung
2) Vergleichstabelle
3) Beispiele
Obwohl die Sonderzeichen beim Shell-Globbing und in Regulären Ausdrücken sehr
ähnlich sind, gibt es doch eine Reihe von Unterschieden, die leicht zu
Verwechslungen führen.
Shell-Globbing ist "schwächer" in seinen Ausdrucksmöglichkeiten als Reguläre
Ausdrücke. Der größte Unterschied ist die "automatische Verankerung" bei den
Shell-Mustern, die bei den Reguläre Ausdrücken durch "^" und "$" erzwungen
werden muss. Außerdem ist das Leerzeichen bei Shell-Globbing ein Sonderzeichen,
um mehrere Muster zu trennen. Soll es Teil des Dateinamens sein, muss es mit
"\" geschützt werden.
Die Unterschiede zwischen den beiden Verfahren existieren aus pragmatischen
Gründen: Die Arbeitsgeschwindigkeit auf der Shell-Kommandozeile soll hoch sein,
d.h. häufig benötigte Aufgaben sollen schnell einzutippen sein. Die Muster in
Perl sollen leistungsfähig sein, daher sind sie etwas komplizierter einzutippen.
| | RegExp /.../ | Shell ("glob") |
+----------------------+-------------------+------------------------+
| Verankerung | nicht automatisch | automatisch |
| GROSS/kleinscheibung | automatisch | Betriebssystemabhängig |
| ... ignorieren | /.../i oder -i | Betriebssystemabhängig |
+----------------------+-------------------+------------------------+
| Quotierung | \ (NUR!) | \ "..." '...' |
| Zeilenanfang (Anker) | ^ | (AUTOMATISCH) |
| Zeilenende (Anker) | $ | (AUTOMATISCH) |
| 1 bel. Zeichen | . | ? |
| Bel. viele bel. Z. | .* | * |
| Zeichenwiederh. 0-N | x* | (NICHT MÖGLICH) |
| Zeichenwiederh. 1-N | x+ | (NICHT MÖGLICH) |
| Zeichenwiederh. M-N | x{M,N} | (NICHT MÖGLICH) |
| Optional (0-1) | x? | (NICHT MÖGLICH) |
| Zeichenklasse | [abc] | [abc] |
| Zeichenbereich | [a-z] | [a-z] |
| Neg. Zeichenklasse | [^abc] | [!abc] evtl. [^abc] |
| ZKl.wiederh. (0-N) | [abc]* | (NICHT MÖGLICH) |
| ZKl.wiederh. (1-N) | [abc]+ | (NICHT MÖGLICH) |
| ZKl.wiederh. (M-N) | [abc]{M,N} | (NICHT MÖGLICH) |
| ZKl. optional (0-1) | [abc]? | (NICHT MÖGLICH) |
| Oder | M1|M2|... | {M1,M2,...} |
| Klammern | (...) | (NICHT MÖGLICH) |
+----------------------+-------------------+------------------------+
| Stern | \* | \* |
| Fragezeichen | \? | \? |
| Punkt | \. | . |
| Dach | \^ | ^ |
| Dollarzeichen | \$ | $ |
| Leerzeichen | " " oder [ ] | \ oder " " oder ' ' |
| Eckige Klammern | \[ \] | \[ \] |
+----------------------+-------------------+------------------------+
| Keine Verankerung | abc | *abc* |
| Links verankert | ^abc | abc* |
| Rechts verankert | abc$ | *abc |
| Voll verankert | ^abc$ | abc |
+----------------------+-------------------+------------------------+
* Beispiele für Regex-Muster und ihre Treffer (*) bzw. Nicht-Treffer (-)
(Strings, Zeilen)
| =~ | /a/ /./ /[abc]/ /[a-z]/ /[^a-z]/ /^[a-z]/ /[a-z]$/ /^[a-z]$/ |
+-----+---------------------------------------------------------------------+
|d | - * - * - * * * |
|made | * * * * - * * - |
|abc | * * * * - * * - |
|aaaa | * * * * - * * - |
|xyz | - * - * - * * - |
|"" | - - - - - - - - |
|" " | - * - - * - - - |
|" "| - * - - * - - - |
|* | - * - - * - - - |
+-----+---------------------------------------------------------------------+
* Beispiel für Shell-Muster und ihre Treffer (*) bzw. Nicht-Treffer (-)
(Dateinamen, glob)
| | *a* *?* *[abc]* *[a-z]* *[!a-z]* [a-z]* *[a-z] [a-z] |
+-----+---------------------------------------------------------------------+
|d | - * - * - * * * |
|made | * * * * - * * - |
|abc | * * * * - * * - |
|aaaa | * * * * - * * - |
|xyz | - * - * - * * - |
|"" | - - - - - - - - |
|" " | - * - - * - - - |
|" "| - * - - * - - - |
|* | - * - - * - - - |
+-----+---------------------------------------------------------------------+