|
Reguläre Ausdrücke (Regular Expressions, RE) sind Standard-Technik
zur Verarbeitung von Strings und Texten. Regular Expressions sind offen und lizenzfrei zugänglich. RE sind zwar vermutlich (?) nicht offiziell standardisiert, jedoch weitgehend portabel. |
Alle modernen Programmiersprachen und viele weitere Programme unterstützen RE. Auf dieser Seite finden sie einige knapp gefasste Beispiele für die Anwendung von RE in gängigen Programmiersprachen. |
Regular Expressions
|
Einführung in das Thema 'Regular Expressions' (RE) |
| RE - Syntax | Grammatik der Regular Expressions (mit Beispielen) |
Live RE Online
|
Live mit RE experimentieren |
| LibreOffice | Suchen und Ersetzen von Steuerzeichen in LibreOffice oder OpenOffice |
| Perl | Perl ist die angestammte Heimat der RE ! |
| Javascript | Javascript bringt RE auf Webseiten |
| Java | Seit Java 2 / 1.4 werden auch RE von Sun-Java unterstützt. |
| PHP | Modul standard / pcre bietet RE-Standardfunktionen |
| Python | Jung und flexibel, unterstützt RE |
| SQL | Der DB-Server MySQL bietet Text-Suche mit Regexp |
| VB | Spät aber doch, eine halbherzige Lösung von M$ |
| Programme | Viele Linux- Programme, Automatisierung der Serververwaltung, ... |
| Beispiele | Programmierung an typischen Beispielen |
| Links |
|
Reguläre Ausdrücke in LibreOffice oder OpenOffice |
||
|
♥ LibreOffice ist in jeder gängigen Linux-Distribution enthalten und ist auch für Windows-PC sehr empfehlenswert. |
Im LibreOffice Programm Writer (Textverarbeitung) ist eine Funktion zur Anwendung von Regulären Ausdrücken enthalten. Sie wird zur Manipulation der nicht druckbaren Steuerzeichen verwendet. | |
AnwendungVerwenden sie im Programm LibreOffice Writer den Menü-Befehl oder die Tasten• Das Fenster 'Suchen und Ersetzen' wird geöffnet. In dieser einfachen Form kann man nach normalen 'lesbaren' Texten suchen oder diese ersetzen. |
• Zur Anwendung auf Steuerzeichen oder andere Sonderzeichen klicken sie Taste und markieren das Kästchen . Danach wird jede Eingabe in das Feld Suchen nach als Regulärer Ausdruck interpretiert. |
|
AbsatzDie 'Einheit' jedes Textverarbeitungs-Programms ist der Absatz. Wenn nicht anders festgelegt, dann werden die jeweiligen RegExp auf jeden Absatz angewendet. Als 'Text zur Bearbeitung' zählen alle Zeichen zwischen dem Anfang der ersten Absatz-Zeile und dem nicht druckbaren Absatz-Zeichen ¶Absatz-Zeichen:
Bei der Suche nach dem Absatz-Zeichen selbst gibt man ein
Suchen nach $
•
Mit findet man das Ende
des nächsten Absatzes.• Mit wird die nächste Absatz-Marke durch den angegebenen Text ersetzt bzw. bei leerem Ersatz-Text gelöscht. • Mit werden alle Absatz-Marken ersetzt bzw. gelöscht. Absatz-Ende
Suchen nach Test$
findet dagegen alle Absätze, die genau mit den Zeichen 'Test' enden Suchen nach Test.$
Findet alle Absätze, die mit Test und danach einem beliebigen Zeichen
enden, z.B. mit einem Punkt oder einem ! Rufzeichen.
Der Punkt ist ein Joker für 'genau 1 beliebiges Zeichen'.Suchen nach \.$
Findet alle Absätze, die mit einem Punkt-Zeichen enden. Damit der
Punkt nicht als RegExp-Joker gilt, wird er mit einem
vorangestellten \ Backslash maskiert.
Suchen nach [^\.]$
Findet alle Absätze, die nicht mit einem
Punkt enden.
|
Absatz-Beginn
Suchen nach ^xyz
Das ^ Zeichen markiert den Beginn jedes Absatzes.^Test findet z.B. alle Absätze, die mit dem Wort-(Anfang) Test beginnen. Absatz-Länge
Suchen nach ^.{10,100}$
findet alle Absätze mit 10 bis 100 beliebigen Zeichen
zwischen ^ Beginn und $ Ende.
Jeder 'weiche' Zeilen-Umbruch unterbricht jedoch die Rechnung..Leere Absätze:
Suchen nach ^$
Das ^ Zeichen markiert den Beginn,
das $ Zeichen das Ende jedes Absatzes.
Der Ausdruck ^$ findet daher alle leeren
Absätze (die man entfernen sollte !).Absatz einfügen:
Um eine Absatz-Marke an bestimmten Text-Stellen neu einzufügen, gibt man ein
Ersetzen durch \n
Achtung: Bei Anwendung von \n im Feld 'Suchen nach'
findet man nicht Absätze, sondern Zeilen-Umbrüche !
|
|
TabulatorSuchen nach \t
findet den nächsten Tabulator. Mit
werden alle Tabulatoren durch die angebenen Zeichen ersetzt.Zeilen-UmbruchSuchen nach \n
findet den nächsten (weichen) Zeilen-Umbruch, d.h. ein Steuerzeichen
für 'Neue Zeile' innerhalb eines Absatzes.
Findet keine 'echten' Absätze !
|
SonderzeichenSuchen nach \x40
findet das nächste @ Zeichen, das mit dem
ASCII-Code dezimal 64 = hex #40 codiert ist.Durch Angabe des hexadezimalen → ASCII-Codes oder des → Unicode kann man jedes beliebige Zeichen finden, z.B. Suchen nach \x20AC
findet das € Euro-Zeichen. Mit dieser Methode
findet man u.a. auch griechische oder kyrillische Zeichen, mathematische
Sonderzeichen usw.
|
|
|
http://help.libreoffice.org/Common/Find_and_Replace/de http://help.libreoffice.org/Writer/Finding_and_Replacing_in_Writer/de http://help.libreoffice.org/Writer/Using_Wildcards_in_Text_Searches/de http://help.libreoffice.org/Common/List_of_Regular_Expressions/de http://help.libreoffice.org/Common/List_of_Regular_Expressions http://wiki.services.openoffice.org/wiki/Documentation/How_Tos/Regular_Expressions_in_Writer |
||
Regular Expressions in Perl |
||
| Perl ist die angestammte Heimat der RegExp und unterstützt sie vorbildlich. Perl bietet für RegExp weit mehr Funktionalität als hier gezeigt werden kann. Details in der Original Perl-Doku unter perlrequick und perlretut | ||
| Funktion | Syntax | Beispiel |
| match | $t =~ m/RE/flg | 'Test' =~ m/e/ ergibt true, weil Zeichen 'e' im Text 'Test' enthalten ist |
| single | $t =~ ?RE? |
Einmaliger Test. Wird bis zum nächsten Reset nur einmal ausgeführt. Anwendung zur einmaligen Suche innerhalb von größeren Texten. |
| replace | $t =~ s/RE/by/flg |
$t = 'Test'; $t =~ s/T/F/; ergibt 'Fest', weil T durch F ersetzt wird. |
| store | $t =~ m/(RE)/flg |
Ausdrücke in () werden
gespeichert und sind in $1,$2,.. verfügbar. $t = 'test.dat'; $T =~ m/(.+)\.(.+)/; $fn = $1; ergibt 'test': alle Zeichen .+ vor dem Punkt \. $fe = $2; ergibt 'dat': alle Zeichen .+ nach dem Punkt \. |
| split | @s = split(/RE/flg,$t) |
Trennt einen String nach der RE, gibt ein
→
Array zurück. $t = '2004-05-20'; ($y,$m,$d) = split(/-/,$t); trennt ein ISO-Datum nach Minus-Zeichen als Separator. |
| once | $t =~ m/RE/o |
Der nachgestellte Operator o bedeutet 'once'. Der RE wird nur einmalig compiliert. Verwendung für RE in Schleifen, die nur einmal berechnet und danach beliebig oft verwendet werden. |
| pos |
$t =~ m/RE/g
$p = pos($t); |
Nur mit dem nachgestellten Operator g (global)
wird Funktion pos (match-position) initialisiert.
Man kann die match-Position lesen oder als Start-Position für den
nächsten match-Versuch schreiben. Vorsicht: pos ist vor einem match undefiniert, und wird bei erfolglosem match nicht geändert ! Das Beispiel liefert alle match-Positionen (hier 3 Treffer für das Zeichen s ):
$t = 'Das ist ein Test';
while ($t =~ m/s/g) { print 'match at pos = '.pos($t)."\n";
}
|
|
Einige der
→ vordefinierten Perl-Variablen betreffen RE ( '=' steht
für äquivalente Variablen in Lang- und Kurzform) Testen sie Kurzform und Langform mit ihrer Perl-Version ! |
||
| $1, $2, $3, ... | Erster, zweiter, dritter ... in () gespeicherter String. - Häufig verwendet. | |
| $LAST_PAREN_MATCH = $+ |
Der letzte gespeicherte String. Achtung: Diese und die folgenden 3 vordefinierten Variablen machen Perl-Scripts langsamer. Nur verwenden, wenn nicht anders möglich. |
|
| $MATCH = $& | Der letzte erfolgreiche match-String | |
| $PREMATCH = $` | Der String vor dem letzten erfolgreichen match | |
| $POSTMATCH = $' | Der String nach dem letzten erfolgreichen match | |
| Beispiel: |
Perl-Script
$t='Das ist ein RE-Test';
$t =~ m/(ist).*(RE)/; |
Ergebnisse:
$1 = 'ist', $2 = 'RE',
$+ = 'RE', $& = 'ist ein RE' $` = 'Das ', $' = '-Test' |
| Besonders praktisch ist die Möglichkeit, Variable als RE-Argumente einzusetzen: | ||
| Beispiel |
$rex = 'suche';
$test =~ m/$rex/; |
So können 'programmierbare RegExp' eingesetzt werden. Lediglich der nachgestellte Operator (g,i,..) muss explizit eingesetzt werden und kann nicht durch eine Variable vertreten werden. |
| Beispiel |
@xa=('htm','php');
$m=0; foreach $x (@xa){
if($test=~m/$x/) {
}
$m++;
}
|
Hier sind einige RexExp-Ausdrücke im Array @xa
enthalten. Sie werden der Reihe nach auf den String $test
angewendet. Bei jedem Treffer wird der Zähler $m
erhöht. Beachten sie die Maskierungs-Regeln: Ein Punkt wird z.B. in einer RegExp mit \. maskiert. Das Zeichen \ muss jedoch selbst maskiert werden, daher muss eine Variable $rex="\\."; lauten, um die gleiche Wirkung zu erzielen. |
|
Perl-Module:
Eine große Zahl zusätzlicher Module bietet die Möglichkeit,
die ohnehin vorbildliche Funktionalität von Perl noch zu erweitern.
|
Allein das Stichwort regex liefert ca. 60 Module, jedes davon mit mehreren Funktionen. Darüber hinaus sind Module für spezielle Anwendungs-Gebiete verfügbar. | |
|
SelfHTML (de), PerlDoc, Zvon, Univ.of Georgia, ITCP Triest: Perl search & replace functions |
||
Regular Expressions in Javascript |
||
| Javascript macht RE für Webseiten verfügbar. Viele Seiten dieses Webs, darunter die Live-RE-Seite verwenden RE mit Javascript. | ||
| Funktion | Syntax | Beispiel |
| Definition |
x = /RE/;
oder
re = "RE";
y = new RegExp(re,flg); |
Einer Variablen lässt sich direkt eine RE zuteilen:
var rex = /ab\d.+/;
So setzen sie ein RegExp-Objekt aus einem RE-string (ohne
die begrenzenden //) und (optional) einem String
für die nachfolgenden Operatoren (flags) zusammen:Die beiden Strings können aus Variablen stammen oder in "" direkt eingegeben werden.
rey = new RegExp("ab\d.+");
rez = new RegExp(rey,"gi"); |
| match | res = str.match(/RE/flg); |
str ist eine string-Variable,
/RE/die Regular Expression, flg (string)
die optionalen nachfolgenden Operatoren (flags). Das Ergebnis res kann mehrfach ausgewertet werden: if (res) {...} // logische Verzweigung nach "match" bzw. "kein match" n = res.length; // Anzahl der match-Treffer (Zahl) ei = res[i]; // das i-te Treffer-Ergebnis (string) |
| replace | res = str.replace(/RE/flg,by); |
str und by sind
String-Variable. In String str wird nach
Regel RE der String by
ersetzt.
str = "Maier";
Um alle Treffer zu ersetzen, setzen sie die
global-flag: Aus diesem
ISO-Datum werden alle Trennzeichen entfernt, nur die Ziffern bleiben
übrig.
res = str.replace(/ai/,"ey");
str = "2001-02-03 12:34:56";
res = str.replace(/[-: ]/g,""); |
| search | pos1 = str.search(/RE/flg); | Liefert die Position des ersten match oder -1 ohne Treffer. |
| store | res = str.match(/(RE)/); |
Ausdrücke in () werden gespeichert und sind
in RegExp.$1,RegExp.$2,.. verfügbar. Beispiel: Isolierung von Jahr, Monat und Tag aus einem ISO-Datum:
id = "2004-03-21";
Beispiel: Isolierung des Dateinamens aus einem Pfad:
res = id.match(/(\d+)-(\d+)-(\d+)/); yy=RegExp.$1; mm=RegExp.$2; dd=RegExp.$3;
mypath = document.location.href;
mypath.match(/([^\/]*)$/); myname = RegExp.$1; |
| execute |
re = /RE/; res = re.exec(str); |
Ausführung einer RegExp, Regel re, am string str. Das Ergebnis kann wie bei match weiter verarbeitet werden. Eine Methode des RegExp-Objekts (s.u.) |
| test | res = re.test(str); | Ausführung wie bei exec, das Ergebnis ist entweder true oder false, je nachdem ob match-Treffer erzielt wurden oder nicht. Eine Methode des RegExp-Objekts (s.u.) |
| split |
str = "Am dam des"; ra = str.split(/\s/g) |
Aufspaltung nach der RE-Regel. Das Ergebnis ra enthält ein → Array mit den einzelnen Ergebnissen, hier ra["Am","dam","des"] |
|
RegExp (object) |
Syntax: RegExp.property $1 .. $9 $ oder input $* oder multiline $& oder lastMatch $+ oder lastParen $` oder leftContext $' oder rightContext lastIndex global ignoreCase multiline source |
Eigenschaften (properties) des RegExp-Objekts: $1..$9: gespeicherte Strings (z.B. var i = RegExp.$1; ) Eingabe-String match über Zeilengrenzen hinweg (true oder false) der letzte gefundene match-String der letzte gespeicherte String Substring bis zum letzten match-Zeichen Substring ab dem letzten match-Zeichen Position des ersten Zeichens nach match-Abbruch true, wenn der match mit global-flag erfolgte true, wenn der match mit ignorecase-flag erfolgte. true, wenn der match mit multiline-flag erfolgte. Quelltext der verwendeten RE. |
|
RegExp (object) |
Syntax: RegExp.method compile(pattern[, flags]) exec test toSource toString |
Methoden (methods) des RegExp-Objekts: compiliert ein RE-Objekt aus einem RE-String und einem flag-String führt einen RE-match aus und gibt ein result-Array zurück. führt einen RE-match aus und gibt true (match) oder false (no match) zurück gibt den Quelltext eines RE-Objekts zurück gibt einen String des RE-Objekts zurück |
|
Flags (flg) |
g → global i → ignoreCase m → multiline |
Javascript unterstützt diese 3 Flags, die auch miteinander kombiniert werden können (z.B. zu gi ). |
Verwendung von evalReguläre Ausdrücke lassen sich ebenso wie jede andere Javascript-Befehlszeile in einem String programmieren und mit Funktion eval ausführen. |
Das ist jedoch normalerweise nicht notwendig, da sich Javascript Reguläre Ausdrücke auch anders aus Variablen zusammenstellen lassen (siehe ↑ oben). |
|
|
SelfHTML (de - RegExp, strings), WebReference, JavaScriptKit, Visibone, John Robert Morris, Furtivecode (Live Online RE), DevGuru, Regular-Expressions.info, |
||
Regular Expressions in Java |
|
| Seit → Java 2 / 1.4 werden RE von Sun-Standard-Java unterstützt. | |
|
Sun ( AbstractFormatter, java.util.regex package, Tutorial, RE-Treffer), Rex (crocodile), Apache Jakarta, ... |
Regular Expressions in PHP |
||
| Mit → PHP Version 5.3 wurde die längst fällige Umstellung der RegExp-Funktionen auf die übliche Standard-Syntax durchgeführt. |
Für die Verwendung Regulärer Ausdrücke stehen folgende
Funktionen zur Verfügung:
preg_grep, preg_match, preg_match_all, preg_quote, preg_replace,
preg_replace_callback, preg_split
|
|
● Neue PHP-Versionen >=5.3Alle preg_* Funktionen sind im Modul standard verfügbar. |
Es ist nicht notwendig, für RegExp irgendein Modul zu laden. Das ehemalige Modul pcre ist aufgelassen, seine Funktionen in standard integriert. |
|
● Alte PHP-Versionen <5.3Das Modul pcre (Perl compatible Regular Expressions) muss ausdrücklich installiert und geladen werden.Im Modul standard befinden sich noch die jetzt ausgelaufenen ereg_* Funktionen. Diese sollten jedoch umgehend gegen die preg_* -Funktionen ausgetauscht werden. |
Die auslaufenden ereg_* Funktionen werden in
diesem Kapitel vorläufig noch angeführt, sollten jedoch ersetzt
werden:
ereg, eregi, ereg_replace, eregi_replace, split
|
|
Null-BytesPHP akzeptiert die Bezeichnung von Null-Bytes in RegExp nur in dieser Form: \x{0} |
BackSlashBezeichnen sie \ Baskslash in PHP-RegExp in dieser Form: \x{5C}Auch verwendbar, aber unklar: \\x5C \\\ |
|
| Funktion | Syntax | Beispiel |
| match |
$res = preg_match("/RE/",$str);
$res = ereg("RE",$str);
$res = eregi("RE",$str); |
Für das Ergebnis 1 genügt ein einziger Treffer, ansonsten wird 0
zurückgegeben. So kann man z.B. die Umgebungs-Variable PATH testen:
$str = getenv('PATH');
Auf einem M$-System enthält der PATH stets den
String Windows oder WINDOWS .
Für den match wird daher das i-flag
(case-independent) verwendet.
if(preg_match("/windows/i",$str) {...} else {...} |
| $im = preg_match_all("/RE/",$str,$ares); | Die Funktion durchsucht den gesamten String $str nach Treffern und gibt deren Anzahl $im zurück. Jeder Treffer wird in das → Array $ares eingetragen. | |
|
$res = strstr($str,$ndl); $res = stristr($str,$ndl); |
Wenn nur das Vorkommen eines Teil-Strings $ndl (die Nadel im Heuhaufen) geprüft werden soll, dann arbeiten diese beiden Funktionen rascher als RegExp ( stristr ist die case-independent Version). | |
| replace |
$res = preg_replace("/RE/",$by,$str);
$res = ereg_replace("RE",$by,$str);
$res = eregi_replace("RE",$by,$str); |
Diese Funktionen verarbeiten jeden Treffer im gesamten String. So wird Meier in Meyer umbenannt, und Zweierlei in Zweyerley.
$str = 'Meier';
$res = preg_replace("/ei/",'ey',$str); |
| $res = preg_replace("/RE/",$by,$str,$lim); |
Die Anzahl der Treffer kann mit dem optionalen Argument
$lim begrenzt werden. Mit $lim=1 wird nur
der erste Treffer ersetzt. So wird Zweierlei in Zweyerlei geändert:
$str = 'Zweierlei';
$res = preg_replace("/ei/",'ey',$str,1); |
|
| store |
preg_match("/RE/",$str,$regs);
Das 3. Argument $regs gibt das Ergebnis-Array an.
ereg("(RE)",$str,$regs);
eregi("(RE)",$str,$regs); |
So kann man eine Adresse in Staat, Postleitzahl und Ort trennen:
$str = 'DL-1234 Entenhausen';
Das ergibt:
preg_match("/([A-Z]*)[^0-9]*([0-9]+)[ \t]+(.*)/",$str,$regs);
$regs[1]='DL';
$regs[2]='1234'; $regs[3]='Entenhausen'; |
| split |
$ares = preg_split("/RE/",$str);
Ein optionales 3.Argument begrenzt die Anzahl der Ergebnis-Elemente.
$ares = split("RE",$str);
$ares = spliti("RE",$str); |
Zerlegt einen String nach der durch RE definierten Regel und gibt ein
→
Array der Bestandteile zurück.
$v = phpversion();
Das ergibt z.B. für Version 5.3.0:
$va = preg_split("/\./",$v,2); $va[0]=5; $va[1]=3;
Der String würde noch ein 3. Element $va[2]=0;
liefern, dieses wird jedoch wegen der Begrenzung auf 2 Elemente ignoriert.
|
|
SelfPHP (de, Reguläre Ausdrücke Posix und Reguläre Ausdrücke) infos24 (de), WebReference, PHPfreaks, |
||
Regular Expressions in Python |
|
| Import des re-Moduls | import re |
| Compilieren einer RE | p = re.compile('test[0-9A-F]+') |
| Anwendung einer compilierten RE: match gibt bei Erfolg ein MatchObject zurück, das weiter verwendet werden kann. Ohne match wird None zurückgegeben. |
m = p.match('test0A')
print m |
|
Auskunft vom MatchObject: group() ergibt den match-string, start() die Anfangsposition, end() die Endposition, span() ein Zahlenpaar beider Positionen. |
if m:
print 'match: '
else:
print 'group = ', m.group() print 'start = ', m.start() print 'end = ', m.end() print 'span = ', m.span() print 'no match'
print re.match('<.*>','<html>xyz</html>').group() |
| findall() gibt eine Liste aller match-strings zurück, hier die 3 Zahlen-strings 12, 34, 46. |
m = re.compile('\d+')
m.findall('12 und 34 ergibt 46') |
|
Eine ausgezeichnete Webseite zum Thema Python & RE bietet A.M. Kuchling |
|
Regular Expressions in SQL |
|
| Je nach DB-Server wird RegExp-Suche in Texten angeboten. MySQL unterstützt RegExp mit dem Operator regexp | |
|
Das Beispiel findet die Zunamen Maier, Mair, Mayer und Mayr, jedoch nicht
Mayereder oder Maler in der Tabelle personen. ♣ Achtung: In älteren Versionen von MySQL unterscheidet regexp streng zwischen großen und kleinen Buchstaben (case-sensitive), in neueren nicht mehr. |
select * from personen where zuname regexp
'Ma[iy]+r';
|
|
|
|
Regular Expressions in VBA |
|
|
Der IT-Marktführer hat jahrelang versucht, Reguläre Ausdrücke
einfach zu ignorieren. Da aber weltweit fast jede Software zur Verarbeitung
von Strings oder Texten nur mehr RE verwendet, hat man sich spät zu
einer halbherzigen Lösung entschlossen. Visual Basic als Standalone-Programmiersprache (nur für Win-Systeme) kennt ab Version 6 ein RegExp-Objekt. |
Leider habe ich noch keine → VBA-Version (für Word oder Excel) mit RE-Unterstützung gesehen. Deshalb verweise ich vorläufig auf einen Artikel im M$-Support. |
|
Regular-Expressions.info: Using Regular Expressions with .NET |
|
Regular Expressions in Programmen |
|
|
▲ Perl ist Standard-Bestandteil aller gängigen Linux-Distributionen. |
▲ → Perl installieren ! - Bietet RE in der Original-Version. Mit Perl-Scripts *.pl kann man dann genauso arbeiten wie mit → Konsolen-Scripts ( *.bat oder *.cmd ), jedoch wesentlich mächtiger - und natürlich auch mit RE ! ▲ → Cygwin installieren ! - Bietet RE in vielen portierten Dienstprogrammen. |
|
● Shell-Konsolen: Fast jedes Linux-Konsolen-Programm unterstützt RegExp. |
●
Text-Editoren und -Prozessoren:
Fast alle Linux-Editoren unterstützen RegExp:BBEdit, Emacs, Nisus Writer, vi , ... |
|
System-Administration:
Programme wie
grep ('global regular
expression print' )
oder
sed (stream editor =
pipeline filter) eignen sich besonders für die automatisierte
Textverarbeitung, wobei typische "Texte" sowohl die Namen von
Dateien und Verzeichnissen als auch deren Inhalte sind.♣ Mit → Cygwin ist grep auch auf Windows-PC verfügbar ! Link: |
Beispiel für grep-Syntax:
# grep "RE" infile >outfile
Hier wird die RE auf den gesamten Inhalt von Datei
infile angewendet, das Ergebnis in Datei
outfile gespeichert.(Auch die RegExp kann in einer Datei enthalten sein.) Achtung: man uallesen, grep verwendet eine etwas abweichende RegExp-Syntax ! |