Hallo, On Mon, 14 Apr 2003, Ralph Müller wrote:
Ich kannte das '?' nur in der Bedeutung von "Das vorangegangene Zeichen keinmal oder einmal". Und auf einmal mit sed funktionierte das nicht mehr. Daß manche Tools die Schreibweise '\?' voraussetzen wußte ich noch nicht. Vor allen Dingen bin ich sehr enttäuscht über das Linux-User-Magazin. Die in der Ausgabe 11/2002 auf Seite 81 im Zusammenhang mit sed (!) erklärten Suchmuster sind offenbar fehlerhaft.
Ich bin nicht ueberrascht.
Ach ja, der Hintergrund meiner Beschäftigung mit sed war, daß ich für meine procmailrc etwas passendes gesucht habe,
Die RE in procmail sind 'egrep' kompatibel, also "extended regular expressions". sed hingegen verwendet "einfache" "regular expressions". Wenn du also zu den in procmail verwendbaren REs was nachlesen willst, dann lies 'man grep' (und dort, die Verwendund der "extended REs". Die wichtigsten Unterschiede bei Metazeichen: RE ERE Bemerkungen bel. Zeichen: . . meist exklusive Zeilenende/-anfang bel. Anzahl: * * [1], auch garnicht(!) ein oder mehrmals: \+ + [1], nicht immer implementiert, [2] Null oder einmal: \? ? [1] gegebene Anzahl: \{N,M\} {N,M} [1], nicht immer implementiert, [2] "ODER" \| | Gruppierung: \(\) () Zeichengruppe: [] [] Zeichenklasse: [[:KLASSE:]] beide, sofern implementiert [2] [1] bezieht sich jew. auf die letzte Gruppe [2] ist zumindest in GNU-sed (simple RE) und GNU-grep (simple und bei egrep / grep -E als extended RE) implementiert Hauptunterschied: die Metazeichen +?|{}() muessen bei simple RE durch einen Backslash "escaped" werden, umgekehrt muessen sie bei extended RE escaped werden, wenn man auf eines dieser Zeichen "matchen" will. Der Unterschied ist also, ob escaped werden muss um die Bedeutung als Metazeichen ein- oder auszuschalten. Weiteres zu den POSIX Regular Expressions siehe 'man 7 regex'. PCRE (Perl Compatible Regular Expression) sind dann wiederum noch erweitert, u.a. durch Escapes wie \s, \S, \w, \W sowie diverses andere in Bezug auf '(?...)'. Naeheres siehe 'man perlre'. Welche Anwendung nun welche Art von Regular Expressions implementiert und ob die Implementation vollstaendig ist, muss man in der man- oder infopage der jew. Anwendung nachlesen. Ah, einen Sonderfall will ich noch erwaehnen: in (e)lisp muessen die Backslashes der (einfachen) REs, die als String angegeben werden (z.B. in der Config, z.B. ein Pattern fuer Dateiextensionen), selber auch escaped werden. Somit gilt z.B: ERE: "\.(foo|bar|baz)" SRE: "\.\(foo\|bar\|baz\)" ELISPRE: "\\.\\(foo\\|bar\\|baz\\)" Um nochmal auf die Frage zurueckzukommen: in procmail werden EREs verwendet, d.h. als Muster ist z.B. folgendes anzugeben: ==== :0 * ^TO_(foo|bar|baz)@domain.tld foobarbaz ==== Naeheres siehe 'man procmailrc' und 'man procmailex'. Da finden sich dann auch Beispiele fuer teils komplexe extended REs, z.B. die Expandierung von '^FROM_DAEMON' ist "sehenswert": ==== Regex auf einer Zeile! radikal nach Zeichen 68 umbrochen ==== (^(Mailing-List:|Precedence:.*(junk|bulk|list)|To: Multiple recipien ts of |(((Resent-)?(From|Sender)|X-Envelope-From):|>?From )([^>]*[^( .%@a-z0-9])?(Post(ma?(st(e?r)?|n)|office)|(send)?Mail(er)?|daemon|m( mdf|ajordomo)|n?uucp|LIST(SERV|proc)|NETSERV|o(wner|ps)|r(e(quest|sp onse)|oot)|b(ounce|bs\.smtp)|echo|mirror|s(erv(ices?|er)|mtp(error)? |ystem)|A(dmin(istrator)?|MMGR|utoanswer))(([^).!:a-z0-9][-_a-z0-9]* )?[%@>\t ][^<)]*(\(.*\).*)?)?$([^>]|$))) ==== Wie man sieht, die (|)? sind nicht "escaped", wenn als Metazeichen verwendet, aber escaped, wenn als "literal" verwendet ;) Viel Spass beim auseinanderpfriemeln wuenscht -dnh, good sigmonster, have a cookie! PS: Bei auseinanderpfriemeln hilft ein gescheiter Editor wie xemacs oder vim, der zusammengehoerende Klammer-paare hervorheben kann :) -- Use strict! *WHAM* Strict, I tell you! And -w! *WHAM* *WHAM* *WHAM* -- Skud