• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

regex-problem

Hi,
habe (immer wieder mal) dasselbe Problem:
suche nach Begriffen, die sowohl in der Zeile, aber sehr wohl auch am Anfang der Zeile stehen können.
Im konkreten Fall die Formulierung "@14.07" oder sonstwas nach dem Schema @datum halt.
Wenn nun vor dem "@" kein Leerzeichen ist, könnte es auch eine Mail-Adresse sein, also ist es naheliegend einfach etwas in der Art zu sagen:
Code:
'/\s@.*\s/'
Wenn das @ aber nun am Anfang einer Zeile steht, nutzt mir das wenig. Auch die folgenden Formulierung gehen nicht:
Code:
'/[^[[:graph:]]]@.*\s/' (stimmt das so?)
Weil es nur sagt(en soll): vor dem "@" muß ein nicht-schwarzes Zeichen sein, die Wahl soll aber sein:
Wenn das @ am Zeilenanfang steht oder vor dem @ ein Leerzeichen steht.
Aber wie kann man das bitte ausdrücken?
 
A

Anonymous

Gast
OsunSeyi schrieb:
Wenn das @ am Zeilenanfang steht oder vor dem @ ein Leerzeichen steht.
Aber wie kann man das bitte ausdrücken?
das genau ist doch schon eine Lösung ;) musst du nur noch genau so auch formulieren.
(Keine Ahnung wo du die Regulären Ausdrücke einsetzen willst, ich nehm mal sed, da sind noch schön viel \ zusätzlich drin ;) )

Code:
echo -e "name@adresse\n@datum\n  @datum\nnoch ein @datum" | sed 's/\(^@.*\|\s@.*\)/TREFFER/g'
wenn auch keine schöne Lösung, da 1. das Leezeichen von einem @ mit gematched wird, und außerdem durch dir "Gier" nicht zwingend einzelne Worte gefunden werden würden.
die Gier kann man eventuell so bekämpfen
Code:
sed 's/\(^@[^ ]\+\|\s@[^ ]\+\)/TREFFER/g'
das mit dem Leerzeichen bleibt aber dabei, also kümmern wir uns mal noch um das Leerzeilen.
Wir teilen den Bereich ein in
1. (vor dem @)
2. (@mit_Wort)
3. (Rest der Zeile)
Code:
echo -e "name@adresse\n@datum\n  @datum\nnoch ein @datum und so\n" | sed 's/\(^\| \)\(@[^ ]\+\)\(.*\)/\1TREFFER\3/g'
Das würde jetzt zumindestens schon mal das erste Vorkommen sauber bearbeiten, ein weiteres Mal würde noch durch (3. Rest der Zeile) unberücksichtigt.

Ließe sich noch beliebig weiterspinnen, aber dazu müsste man wissen was du genau machen willst.
ansonsten hoffe ich das hilft dir weiter.

robi
 
(^@.*\|\s@.*\) genügt vollkommen,
komisch, daß man so oft auf das naheliegende nicht kommt (geht mir bei regex oft so, Frage der Übung?). Benutze zum ersten mal Perl, aber immer noch ziemlich :irre: ...
Kopiere ich mir das "zu weiteren Studien" erstmal heraus.
Danke für die Mühe,
tom
 
... vielleicht sollte man bei Perl nicht gleich mit den regulären Ausdrücken anfangen, sondern erstmal die Datentypen, Kontrollstrukturen usw. kennenlernen.
Dann kann man das z.B. so machen:
Code:
#!/usr/bin/perl

use warnings;
use strict;

while(<>)
{
    if($_ =~ m/^@/ || $_ =~ m/ @/)
    {
        print "Found.\n";
    }
}
Und von da:
Code:
echo "@sda" | perl -e 'while(<>){if($_ =~ m/^@/ || $_ =~ m/ @/){print "Found.\n";}}'
Gruß
 
Benutze Perl eigentlich nur innerhalb von Shell-Scripten gerade wegen der Möglichkeit, über Klammern auf die Matches zugreifen zu können:
Code:
perl -ne 'print "$1$2$3$4\n"
                while /@([^: ]*)\s?([^: ]*)\s?([^: ]*)\s?(:.*\.).*$/gi'
Kenne mich mit regex ein bißchen besser aus als mit perl, und wenn man so eine Formulierung wie oben mal hat (und nur kopieren und anpassen muß) ist das immerhin besser als nix, denn mir ist bei den anderen 'Bordmitteln' nicht bekannt, wie man das mit den Klammern hinkriegen könnte.
tom
 
Benutze Perl eigentlich nur innerhalb von Shell-Scripten
Daher meine Anregung, wenn Du das machen willst, wäre ein Weg, mehr Perl-Grundlagen kennenzulernen.
Diese perl-Switches ("-e", "-p" und "-i") verführen zu sog. "gefährlichem Halbwissen".

Gruß
 
Was bist Du doch böse: Grundlagen lernen wo doch Alle mit so tollen 1-Zeilern rummachen. Komm, das geht doch nun gar nicht... ;)
 
Oben