Teil 03: egrep
Nun geht es an die Praxis. Wir verwenden hierfuer nun egrep, das auf POSIX Extended Regular Expressions (EREs) basiert.
Das Escapezeichen ist bei allen ueblichen RE-Varianten der Backslash (\).
Was die Literale und Metazeichen angeht, ist es leider nicht so schoen klar wie wir es in der vorigen Einheit betrachtet haben. Dort waren jeweils die unescapeten Zeichen Literale und die escapeten Zeichen Metazeichen, bzw. umgekehrt. In der Praxis sind diese zwei Zeichenarten nicht so klar getrennt, sondern vermischt. Es ist weiterhin so, dass das Escapen die Zeichenart aendert, aber sowohl unescapete Zeichen als auch escapete Zeichen koennen sowohl Literale als auch Metazeichen sein. Das macht die Sache etwas schwieriger. Bei den unescapeten Zeichen sind also manche Literale und manche Metazeichen; welche was sind muss man auswendig lernen. Immerhin sind bei EREs alle escapeten Zeichen Literale. (Das ist bei BREs nicht so.) Allerdings kann man auch wiederum nicht einfach ein beliebiges Zeichen escapen, um es zu einem Literal zu machen. Escapet man beispielsweise einen Buchstaben, so ist das Verhalten undefiniert. Und da POSIX nur eine nachtraegliche Zusammenfassung des groessten gemeinsamen Nenners der vielfaeltigen Unix-Realitaet ist, verhalten sich die konkreten Programme oft nochmal ein bisschen anders als es in POSIX beschrieben ist.
Konkret heisst das, dass man fuer jede RE-Variante und letztlich fuer jedes Programm separat auswendig lernen muss, welche Zeichen Sonderbedeutungen haben!
Das ist wohl die groesste Schwierigkeit bei der Verwendung von REs. Wir gehen vorerst von EREs aus (z.B. in egrep, awk), die in der Hinsicht etwas einfacher sind als BREs (z.B. in grep, sed).
In EREs steht jedes Zeichen fuer sich selbst, ausser es ist ein Zeichen mit Sonderbedeutung. Die Zeichen mit Sonderbedeutung sind:
Code: Alles auswählen
\.[]()*+?{}|^$
Kurzum koennen wir uns aber merken, dass alle Buchstaben, Zahlen und z.B. Unterstrich, Apostroph und Anfuehrungszeichen immer literal fuer sich selbst stehen.
Obige Sonderzeichen sind an den meisten Stellen Metazeichen. Wenn wir sie escapen, werden sie literal interpraetiert.
Aufgaben:
1) Schreibe einen egrep-Ausdruck der die Zeichenkette ``Reiter'' matcht. Teste ihn entweder so:
Code: Alles auswählen
echo "Reiter" | egrep 'DEIN_AUSDRUCK'
2) Schreibe einen egrep-Ausdruck der die Zeichenkette ``Viel Steine'' matcht.
3) Schreibe einen egrep-Ausdruck der die Zeichenkette ``heil'gen'' matcht.
4) Schreibe einen egrep-Ausdruck der die Zeichenkette ``Er sprach: "Sagt an,'' matcht.
5) Schreibe einen egrep-Ausdruck der die Zeichenkette ``eben.'' matcht. Testet mit `-o' und ohne.
6) Schreibe einen egrep-Ausdruck der die Zeichenkette ``?'' matcht.
7) Vergleiche diese egrep-Ausdruecke mit der Verwendung von fgrep, welches eine simple Stringsuche umsetzt. Bei fgrep werden alle Zeichen literal interpraetiert. Wo liegen die Unterschiede? (Bis zu diesem Zeitpunkt wird euch egrep noch nicht besser als fgrep vorkommen. Das aendert sich bald.)
Verwende egrep fuer ein Stueck Quellcode, der Sonderzeichen enthaelt. Schreibe dafuer egrep-Ausdruecke, die Sterne, Klammern und Punkte matchen.
Inputtext: schaebische-kunde.txt 41651