Sample0: Reguläre Ausdrücke mit awk/ Denkfehler

Hallo ihr da,

ich teste gerade etwas mit awk und reguläre ausdrücke unter linux.
und zwar habe ich eine datei mit verschiedenen e-mail adressen die ich extrahieren möchte, doch irgendwie stehe ich gerade voll auf dem schlauch und verstehe meine eigenen regulären ausdrücke nicht mehr.
ich schreibe mal wie ich vorgehe, vieleich ist mein vorgehen ja falsch, also ich nehme mir das was ich suchen möchte, in diesem fall eine e-mail adresse und meinen regulären ausdrück wie ich es denke:

irgendwas@keineahnung.de

[A-z]+@[A-z]+.[A-z]+$

so, [A-z] bedeutet doch das ein zeichen von A-z egal ob gross oder klein geschrieben.
da ich aber nicht weiss wie lang der string vor dem @-zeichen ist, setze ich ein + dahinter, das + bedeutet doch "Ein oder mehreres Auftreten des vorangegangenes Zeichen" in diesem fall das eines  ziwschen A-z.
danach soll ein @ zeichen kommen also bin ich schon soweit:

[A-z]+@

nach dem @ kommt wieder ein string dessen länge ich nicht kenne also wieder [A-z]+
dann kommt im normalfall ein punkt, da ein punkt aber eine funktion hat kaskadiere ich ihn .\ nun bin ich soweit:

[A-z]+@[A-z].\

nach dem punkt . kommt dann ja meistens die TPL endung de oder org oder auch com [... usw]
die setzte ich auch mit [A-z]+ zusammen da ich ja auch nicht die länge kenne ob nun de 2 oder com 3 und ausserdem noch am ende des musters $
fertig ist mein ausdruck:

[A-z]+@[A-z]+.[A-z]+$

Mit awk im zusammenhang der datei aus dem die adressen gesucht werden sollen:

awk '/[A-z]+@[A-z]+.[A-z]+$/{print "Gefunden",$0}'

doch mir wird nichts angezeigt.
schreibe ich den ausdruck so:
 [A-z]+@[A-z]+.\de$

bekomme ich mailadresse mit endung 'de' aber ich möchte alle haben wo ich die endung nicht kenne.

ich hoffe mir kann da einer helfen und evtl. mich auf einen denkfehler hinweisen.
deshalb habe ich auch alles ausführlich geschrieben, vieleicht kann der ein oder andere einen denkfehler ausmachen.

danke im vorraus!

euer Sample0

  1. hi,

    [A-z]+@[A-z]+.[A-z]+$

    ich glaube hier fehlt einfach nur noch ein +

    -> [A-z]+@[A-z]+.+[A-z]+$

    probier das mal aus...und was machst du mit Mail-Adressen wie "meinname123@hotmail24.com"? Du solltest auch noch Zahlen berücksichtigen, die liegen glaube ich vor den Buchstaben - also [0-z], die Sonderzeichen kommen dahinter (es gibt ja auch Adressen wie "mein_name@123.ch"

    Solltest dir also nochmal ne ASCII-Tabelle angucken.

    Gruss,
    Seppel

    1. Hi,

      ich glaube hier fehlt einfach nur noch ein +

      -> [A-z]+@[A-z]+.+[A-z]+$

      Habe ich schon durch, klappt nicht. Aber wieso muss denn da ein Plus stehen? Der Punkt ist ja angeben und zählt doch soviel wie "der punkt muss da sein" oder nicht?

      probier das mal aus...und was machst du mit Mail-Adressen wie "meinname123@hotmail24.com"? Du solltest auch noch Zahlen berücksichtigen, die liegen glaube ich vor den Buchstaben - also [0-z], die Sonderzeichen kommen dahinter (es gibt ja auch Adressen wie "mein_name@123.ch"

      Ja das weiss ich, das wollte ich erstmal aus lassen weil ich erst damit anfange mich mit regulären ausdrücken zu befassen.
      Aber danke für den tip [0-z]!

      bis dann!

      1. Hi,

        ich glaube hier fehlt einfach nur noch ein +

        -> [A-z]+@[A-z]+.+[A-z]+$

        Denkfehler meiner Seits...kommt glaube vom Javascripten, alles mit + zu einer Zeichenkette zusammensetzen zu wollen :)

        aber musst du beim setzen des Punktes nicht nur einen Backslash machen? Hab hier leider nichts zum testen, aber:

        [A-z]+@[A-z]+.[A-z]+$

        Und jetzt bin ich ruhig - sonst artet das hier noch in Raterei aus...ist schon was her das ich mich damit beschäftigen musste.

        Gruss
        Seppel

        1. Hallo,

          danke dir für deine mühe!
          schönen tag noch!

          bis dann!

  2. gudn tach Sample0!

    irgendwas@keineahnung.de

    [A-z]+@[A-z]+.[A-z]+$

    ^ moep!

    punkte werden maskiert, wenn sie als literal gematcht werden sollen, also
      .

    das baskslash danach veranlasst, das "[" ebenfalls literal zu matchen.

    dann kommt im normalfall ein punkt, da ein punkt aber eine funktion hat kaskadiere ich ihn .\ nun bin ich soweit:

    da liegt der fehler.

    danke im vorraus!

    s/rr/r/ ;-)

    prost
    seth

    1. Hey seth,

      hey danke! stimmt, mit .\ habe ich das andere zeichen auch maskiert... man man man wie konnte ich das übersehen oder warum habe ich das überhaupt so gemacht? naja, man weiss es nicht ;)
      aber super lieben dank!

      bis dann!

    2. Hallö,

      ich fange auch an mit den regulären ausdrücken zuarbeiten.
      doch wie bekomme ich das hin wenn ein zeichen z.b 3 mal vorkommen muss?
      danke für deine hilfe

      1. gudn tach!

        doch wie bekomme ich das hin wenn ein zeichen z.b 3 mal vorkommen muss?

        {3}

        nomalerweise (d.h. in perl) gilt:

        *    Match 0 or more times
            +    Match 1 or more times
            ?    Match 1 or 0 times
            {n}    Match exactly n times
            {n,}   Match at least n times
            {n,m}  Match at least n but not more than m times

        (quelle: perldoc perlre)

        in awk muss man das erst "freischalten":

        Interval expressions are only available if either --posix or --re-interval is specified on the command line.

        (quelle: man gawk)

        prost
        seth

  3. Hi,

    so, [A-z] bedeutet doch das ein zeichen von A-z egal ob gross oder klein geschrieben.

    Ist das bei awk anders als üblich? Wäre mir neu, sollte doch bei awk so sein wie bei sed, in vi usw.

    In den mir bekannten Regex-Maschinen bedeutet [A-z] ein beliebiges Zeichen zwischen großem A und kleinem z - das sind ein paar Zeichen mehr als nur die Buchstaben, nämlich die eckigen Klammern, der Backslash, das Caret, das Backtick und der Unterstrich (siehe z.B. http://www.unicode.org/charts/PDF/U0000.pdf).

    Wenn wirklich nur die Buchstaben gewünscht sind: [A-Za-z] oder, wenn der gesamte Ausdruck case-insensitive ist, das i-Flag setzen und nur [a-z] oder [A-Z] nutzen.

    da ich aber nicht weiss wie lang der string vor dem @-zeichen ist, setze ich ein + dahinter, das + bedeutet doch "Ein oder mehreres Auftreten des vorangegangenes Zeichen" in diesem fall das eines  ziwschen A-z.
    danach soll ein @ zeichen kommen also bin ich schon soweit:

    [A-z]+@

    Hm. Im ungequoteten local-part können durchaus auch andere Zeichen (z.B. Bindestrich oder Punkt oder Ziffern) vorkommen.

    nach dem @ kommt wieder ein string dessen länge ich nicht kenne also wieder [A-z]+

    s.o. - auch hier sind wesentlich mehr Zeichen als nur Buchstaben erlaubt.

    dann kommt im normalfall ein punkt, da ein punkt aber eine funktion hat kaskadiere ich ihn .\ nun bin ich soweit:

    kaskadieren? Du meinst escapen?
    Aber dazu ist (wie ja schon erwähnt wurde) nur der \ vor dem Punkt richtig - der \ danach escapet das folgende Zeichen.

    [A-z]+@[A-z].\ nach dem punkt . kommt dann ja meistens die TPL endung de oder org oder auch com [... usw]

    TPL? TLD (Top-Level-Domain).

    Es könnte aber auch die SLD folgen. Oder die Third-Level-Domain. Oder die fourth-level-domain. Oder ...

    die setzte ich auch mit [A-z]+ zusammen

    s.o., da sind immer noch zu viele Zeichen drin.

    da ich ja auch nicht die länge kenne ob nun de 2 oder com 3

    oder z.B. info mit 4 oder travel mit 6 Zeichen.

    Da die TLD aus mindestens 2 und (derzeit) maximal 6 Zeichen besteht, wäre anstelle des + auch {2,6} sinnvoll.

    und ausserdem noch am ende des musters $

    Wenn Du den Ausdruck am Stringende verankern willst, warum dann nicht auch am Stringanfang mit ^ ?

    [A-z]+@[A-z]+.[A-z]+$

    @[@]._^

    würde von Deinem Ausdruck gefunden ...

    awk '/[A-z]+@[A-z]+.[A-z]+$/{print "Gefunden",$0}'
    doch mir wird nichts angezeigt.

    Das liegt hauptsächlich am [ - keine Deiner Mail-Adressen enthält ein [ nach einem Punkt ...

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. gudn tach!

      so, [A-z] bedeutet doch das ein zeichen von A-z egal ob gross oder klein geschrieben.

      Ist das bei awk anders als üblich? Wäre mir neu, sollte doch bei awk so sein wie bei sed, in vi usw.

      ja, awk verhaelt sich hier wie vi und sed.

      und zum rest kann ich auch nur "ack" sagen, wobei wir halt die datei, die er durchsucht nicht kennen, weshalb diese "[1]+@...$"-geschichte evtl. schon fuer sein vorhaben genuegt.
      als e-mail-adressen-ueberpruefung waere es sicher nicht geeignet. beispielsweise minusse und punkte werden ja gar nicht erlaubt.

      prost
      seth


      1. A-z ↩︎