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).

Inhaltsverzeichnis

1) Einführung
2) Vergleichstabelle
3) Beispiele

1) Einführung   (Top)

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.

2) Vergleichstabelle   (Top)

  |                      |   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                    |
  +----------------------+-------------------+------------------------+

3) Beispiele   (Top)

* 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  |  -    *      -        *         -        *         *         -      |
  |""   |  -    -      -        -         -        -         -         -      |
  |" "  |  -    *      -        -         *        -         -         -      |
  |"   "|  -    *      -        -         *        -         -         -      |
  |*    |  -    *      -        -         *        -         -         -      |
  +-----+---------------------------------------------------------------------+