Awk: Grundlagen: Reguläre Ausdrücke

Aus Wikibooks


Simple reguläre Ausdrücke[Bearbeiten]

Ein einfacher String oder ein Zeichen kann bereits einen regulären Ausdruck darstellen.

Beispiel: Wir wollen in der personendatenbank.txt alle Datensätze, die den Buchstaben i beinhalten, vollständig ausgeben.

awk-Skript:

/i/ 

Ausgabe:

Mimi    P    13.08.2005 
Susi    T    23.09.1999 
Fritz   X    03.03.2001

Erläuterung: Das awk-Skript besteht nur aus einer Bedingung, einem geklammerten regulären Ausdruck. Der Ausdruck /i/ entspricht der Bedingung $0~/i/. Das Zeichen ~ steht für beinhaltet.

Beispiel: Alle Datensätze, welche den Vornamen Mimi aufweisen sollen ausgegeben werden.

awk-Skript':

$1=="Mimi"

Beliebige Zeichen[Bearbeiten]

Ein beliebiges Zeichen in einem Regulären Ausdruck wird durch einen Punkt . symbolisiert.

Beispiel: Das awk-Skript

$1~/M.m/

würde unter anderem für folgende Zeichenketten passen,

Mime
aMime
bMummu
ccccMxm
ddMMMM2mmm

Anker[Bearbeiten]

In obigen Beispielen durfte ein bestimmtes Suchmuster irgendwo in einem Feld oder Datensatz vorkommen, damit eine Aktion gestartet wurde. Wir können das Vorkommen eines Suchmusters aber auch auf den Anfang oder das Ende eines Feldes oder Datensatzes beschränken. Dazu dienen die Zeichen ^ (Anfang) und $ (Ende).

Beispiel: Alle Datensätze, die mit Mi beginnen sollen ausgegeben werden.

awk-Skript:

/^Mi/

Beispiel: Alle Datensätze, deren erstes Feld mit z endet, sollen ausgegeben werden.

awk-Skript:

$1~/z$/

Beispiel: Der reguläre Ausdruck ^..$ deckt alle Strings ab, die genau 2 Zeichen lang sind.

Zeichenklassen[Bearbeiten]

Sollen nur bestimmte Zeichen an einer Stelle zugelassen werden, dann sind Zeichenklassen von großem Nutzen. Eine Zeichenklasse wird durch eckige Klammern [] gekennzeichnet.

Beispiel: Wir wollen alle Datensätze ausgeben in denen Mim, mim, Mam, mam, Mum oder mum vorkommen.

awk-Skript:

/[Mm][aiu]m/

Beispiel: Es sollen alle Datensätze ausgegeben werden, die mit Buchstaben zwischen A und F (groß- oder kleingeschrieben) beginnen.

awk-Skript:

/^[A-Fa-f]/

Beispiel: Es sollen alle Datensätze ausgegeben werden, die nicht mit Buchstaben zwischen A und F (groß- oder kleingeschrieben) beginnen.

awk-Skript:

/^[^A-Fa-f]/

gawk kennt auch Gruppen spezieller Zeichenklassen, zum Beispiel

Zeichenklasse
[:alnum:] alle alphanumerischen Zeichen
[:alpha:] alle Zeichen des Alphabets
[:blank:] Leerzeichen und Tabulator
[:cntrl:] alle Steuerzeichen
[:digit:] Ziffern [0-9]
[:lower:] alle kleingeschriebenen Zeichen des Alphabets
[:upper:] alle großgeschriebenen Zeichen des Alphabets
[:xdigit:] Hexadezimalziffern [0-9a-f]

Beispiel: Das awk-Skript

/^[[:alpha:]]/

listet alle mit einem Alphabetzeichen beginnenden Datensätze.

Äquivalenzklassen[Bearbeiten]

Beispiel:

/[[=a=]]/

matcht neben a auch ä, à, â, ...

Alternativen[Bearbeiten]

Beispiel: Mit der Bedingung

/imi|usi/

würden bei der personendatenbank.txt sowohl der Mimi- als auch der Susi-Datensatz gelistet.

Gruppierung[Bearbeiten]

Mehrere Zeichen in einem regulären Ausdruck können durch Klammerung () gruppiert werden.

Wiederholungen[Bearbeiten]

Soll (un)abhängig von der Anzahl eines bestimmten Zeichens oder einer Zeichengruppe die Aktion ausgeführt werden, so können Quantoren hilfreich sein.

Quantor Bedeutung Beispiel "matcht"
* beliebig oft (xa)* "", xa, xaxa, xaxaxa, ...
+ beliebig oft, aber mindestens einmal (xa)+ xa, xaxa, xaxaxa, ...
? null- oder einmal (xa)? "", xa
{n} genau n-mal (xa){2} xaxa
{n,} mindestens n-mal (xa){2,} xaxa, xaxaxa, ...
{,n} höchstens n-mal (xa){,2} "", xa, xaxa
{n,m} n- bis m-mal (xa){2,3} xaxa, xaxaxa

Escape-Sequenzen[Bearbeiten]

Wie sucht man in einem Text nach dem Vorkommen eines Punktes? Ein regulärer Ausdruck in der Form

/./ 

ist nicht zielführend, da der Punkt . bei regulären Ausdrücken ein beliebiges Zeichen charakterisiert.

Deshalb besteht die Möglichkeit, die Sonderbedeutung eines Zeichens temporär auszuschalten (zu quoten). Zu diesem Zweck stellt man dem Sonderzeichen einen Backslash \ voran.

Beispiel:

/\./


Auch Steuerzeichen oder Formatangaben werden mit einem Backslash \ eingeleitet.

Diesen Vorgang bezeichnet man generell in allen Programmiersprachen als 'escapen'.


Beispiele:

Steuerzeichen Bedeutung
\a BEL, Piepston
\t HT, horizontalerTabulator
\n LF, neue Zeile
\r CR, carriage return
\nnn eine Zahl nnn im OCT-Format
\xhh eine Zahl hh im HEX-Format


Reguläre Ausdrücke sind nicht auf Bedingungen beschränkt, auch innerhalb von Aktionen ist dieses Konzept einsetzbar.

Beispiel: Das awk-Skript

{if ($1~/M.m/) print $0}

entspricht

$1~/M.m/

Zum Übungsteil[Bearbeiten]