Hallo, ich dachte ich könnte RegEx, bis mich sed eines besseren belehrte: ralph@erde:~ > echo "Hallo Welt" | sed 's/W?elt/Tux/' Hallo Welt Wieso ist das Ergebnis "Hallo Welt" und nicht "Hallo Tux"? Ralph
On Son, 13 Apr 2003 at 11:36 (+0200), Ralph Müller wrote:
ich dachte ich könnte RegEx, bis mich sed eines besseren belehrte:
ralph@erde:~ > echo "Hallo Welt" | sed 's/W?elt/Tux/' Hallo Welt
Wieso ist das Ergebnis "Hallo Welt" und nicht "Hallo Tux"?
Versuchs mal so: jan@k500:~> echo "Hallo Welt" | sed 's/W\?elt/Tux/' Hallo Tux Jan
Am Sonntag, 13. April 2003 13:48 schrieb Jan Trippler:
On Son, 13 Apr 2003 at 11:36 (+0200), Ralph Müller wrote:
ich dachte ich könnte RegEx, bis mich sed eines besseren belehrte:
ralph@erde:~ > echo "Hallo Welt" | sed 's/W?elt/Tux/' Hallo Welt
Wieso ist das Ergebnis "Hallo Welt" und nicht "Hallo Tux"?
Versuchs mal so: jan@k500:~> echo "Hallo Welt" | sed 's/W\?elt/Tux/' Hallo Tux Bescheidene Frage - wofür soll das gut sein? Das bewirkt genau das selbe wie: echo "Hallo WunderWelt" | sed 's/Welt/Tux/' Hallo WunderTux
oder hab ich das was gravierendes übersehen??? ;-) lg, Andreas.
* Andreas Scherer schrieb am 13.Apr.2003:
Am Sonntag, 13. April 2003 13:48 schrieb Jan Trippler:
Versuchs mal so: jan@k500:~> echo "Hallo Welt" | sed 's/W\?elt/Tux/'
Bescheidene Frage - wofür soll das gut sein? Das bewirkt genau das selbe wie: echo "Hallo WunderWelt" | sed 's/Welt/Tux/' Hallo WunderTux
echo "Hallo WunderTux" bewirkt auch das selbe.
oder hab ich das was gravierendes übersehen??? ;-)
echo "Hallo underWelt" | sed 's/W\?elt/Tux/' Bernd -- Alle meine Signaturen sind rein zufällig und haben nichts mit dem Text oder dem Schreiber zu tun, dem ich antworte. Falls irgendwelche Unrichtigkeiten dabei sein sollten, so bedauere ich das. Es wäre nett, wenn Du mich benachrichtigen würdest. |Zufallssignatur 0
Am Sonntag, 13. April 2003 17:30 schrieb Bernd Brodesser:
* Andreas Scherer schrieb am 13.Apr.2003:
Am Sonntag, 13. April 2003 13:48 schrieb Jan Trippler:
Versuchs mal so: jan@k500:~> echo "Hallo Welt" | sed 's/W\?elt/Tux/'
Bescheidene Frage - wofür soll das gut sein? Das bewirkt genau das selbe wie: echo "Hallo WunderWelt" | sed 's/Welt/Tux/' Hallo WunderTux
echo "Hallo WunderTux"
bewirkt auch das selbe.
oder hab ich das was gravierendes übersehen??? ;-)
echo "Hallo underWelt" | sed 's/W\?elt/Tux/'
Knapp daneben. *lol* Das ergibt auch die Ausgabe: underTux Aber wenn Du schreibst echo "Hallo elt" | sed 's/W\?elt/Tux/' ergibt das Hallo Tux ;-) lg, Andreas.
Bernd
On Son, 13 Apr 2003 at 16:00 (+0200), Andreas Scherer wrote:
Am Sonntag, 13. April 2003 17:30 schrieb Bernd Brodesser:
* Andreas Scherer schrieb am 13.Apr.2003:
Am Sonntag, 13. April 2003 13:48 schrieb Jan Trippler:
Versuchs mal so: jan@k500:~> echo "Hallo Welt" | sed 's/W\?elt/Tux/'
Bescheidene Frage - wofür soll das gut sein? Das bewirkt genau das selbe wie: echo "Hallo WunderWelt" | sed 's/Welt/Tux/' Hallo WunderTux
echo "Hallo WunderTux"
bewirkt auch das selbe.
oder hab ich das was gravierendes übersehen??? ;-)
echo "Hallo underWelt" | sed 's/W\?elt/Tux/'
Knapp daneben. *lol*
Das ergibt auch die Ausgabe: underTux
Aber wenn Du schreibst echo "Hallo elt" | sed 's/W\?elt/Tux/' ergibt das Hallo Tux ;-)
Eben, genau das war das ursprüngliche Anliegen! Der Ausdruck W\?elt passt eben nicht nur auf Welt, sondern auch auf elt. Der Originalposter wollte IMHO eben dies und das ging mit dem Pattern W?elt nicht. Jan
On Son, 13 Apr 2003 at 12:45 (+0200), Andreas Scherer wrote:
Am Sonntag, 13. April 2003 13:48 schrieb Jan Trippler:
On Son, 13 Apr 2003 at 11:36 (+0200), Ralph Müller wrote:
ich dachte ich könnte RegEx, bis mich sed eines besseren belehrte:
ralph@erde:~ > echo "Hallo Welt" | sed 's/W?elt/Tux/' Hallo Welt
Wieso ist das Ergebnis "Hallo Welt" und nicht "Hallo Tux"?
Versuchs mal so: jan@k500:~> echo "Hallo Welt" | sed 's/W\?elt/Tux/' Hallo Tux Bescheidene Frage - wofür soll das gut sein? Das bewirkt genau das selbe wie: echo "Hallo WunderWelt" | sed 's/Welt/Tux/' Hallo WunderTux
Das bewirkt _in diesem Beispiel_ das gleiche. Das Suchmuster /Welt/ passt auf Welt und sonst nix. Das Muster /W\?elt/ passt z. b. auch auf elt, Zelt, Belt.
oder hab ich das was gravierendes übersehen??? ;-)
Ja. Jan
* Andreas Scherer
Am Sonntag, 13. April 2003 13:48 schrieb Jan Trippler:
On Son, 13 Apr 2003 at 11:36 (+0200), Ralph Müller wrote:
ich dachte ich könnte RegEx, bis mich sed eines besseren belehrte:
ralph@erde:~ > echo "Hallo Welt" | sed 's/W?elt/Tux/' Hallo Welt
Wieso ist das Ergebnis "Hallo Welt" und nicht "Hallo Tux"?
Versuchs mal so: jan@k500:~> echo "Hallo Welt" | sed 's/W\?elt/Tux/' Hallo Tux
Bescheidene Frage - wofür soll das gut sein? Das bewirkt genau das selbe wie: echo "Hallo WunderWelt" | sed 's/Welt/Tux/' Hallo WunderTux
Klar ist die Wirkung in diesem speziellen Fall dieselbe. :-) 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. Ach ja, der Hintergrund meiner Beschäftigung mit sed war, daß ich für meine procmailrc etwas passendes gesucht habe, um auch die Umlaute in den utf-8 codierten Mails von Hartmut richtig lesen zu können. Die neueren Mutt-Versionen sind zwar utf-8 fähig, aber ein utf-8-fähiges xterm ist dafür zwingende Voraussetzung. (Mein Mutt läuft im xterm.) Ja ich weiß, daß das mittels procmail keine elegante Lösung ist, sondern hmm naja nur etwas sehr Behelfsmäßiges. *schäm* Aber wegen ein paar Umlauten extra mein X3.3.6 updaten zu müssen, wäre wie mit Kanonen auf Spatzen geschossen. Ralph
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
* Ralph Müller schrieb am 13.Apr.2003:
ich dachte ich könnte RegEx, bis mich sed eines besseren belehrte:
ralph@erde:~ > echo "Hallo Welt" | sed 's/W?elt/Tux/' Hallo Welt
Wieso ist das Ergebnis "Hallo Welt" und nicht "Hallo Tux"?
Es wird nach W?elt gesucht, mit einem Fragezeichen darin. Bei manchen RegEx heißt ? ein oder kein Mal das vorherige Zeichen und \? bedeutet das Fragezeichen selber, bei anderen RegEx ist es genau umgekehrt. Das gleiche hast Du bei ( und \( oder auch bei + und \+ und bei < und \< Ich habe es aufgegeben, mir zu merken, wo was wie ist. Wenn ich es brauche, probiere ich es aus. Bernd -- ACK = ACKnowledge = Zustimmung | NAC = No ACknowledge = keine Zustimmung DAU = Dümmster Anzunehmender User | LOL = Laughing Out Loud = Lautes Lachen IIRC = If I Remember Correctly = Falls ich mich richtig erinnere OT = Off Topic = Am Thema (der Liste) vorbei |Zufallssignatur 11
participants (5)
-
Andreas Scherer
-
B.Brodesser@t-online.de
-
David Haller
-
Jan.Trippler@t-online.de
-
Ralph Müller