grep - regulärer Ausdruck

Sinepp

Registered User
Hallo Leute,

ich bastel gerade an einem regulären Ausdruck für grep. Er soll aus einer Datei alle Einträge mit "denie" anzeigen, aber nicht solche die zusätzlich den Begriff "tralla" beinhalten.

Bisher löse ich das so:
Code:
grep "denie" /var/www/datei.txt | grep -v "tralla"

Versucht habe ich bisher z.B.
Code:
grep ".*denie.*(?!=tralla).*" /var/www/datei.txt
- aber da gibt es einen Fehler in der Shell...

oder
Code:
grep "denie.*(tralla){0}" /var/www/datei.txt

Hat hier jemand einen Tipp, wie man es eleganter machen kann, als bei meiner Lösung?

Danke,
Sinepp
 
grep "denie" /var/www/datei.txt | grep -v "tralla"
Das ist IMHO schon die einfachste und best lesbare Lösung. Solche "negativen" Suchen sind mit den standart regulären Ausdrücken schwer bis unmöglich.
Versucht habe ich bisher z.B. grep ".*denie.*(?!=tralla).*" /var/www/datei.txt - aber da gibt es einen Fehler in der Shell...
Meine bash gibt da keinen Fehler aus, welche shell verwendest du? Du solltest egrep oder grep -E verwenden, sonst darfst du das komplizierte Zeug (nicht mal Klammern) nicht verwenden. "(?!=" gibt es nicht, nur (?= bzw (?! (positives bzw negatives Lookahead). Die .* am Anfang und am Ende kannst du dir sparen. Beide Ausdrücke können nicht so wie du denkst funktionieren weil das mittlere .* gierig den gesammten nach "denie" verbleibenen String verschluckt und der restliche leere String immer ungleich tralla ist.
Zum debuggen von regulären Ausdrücken bietet sich Perl an:
Code:
 perl -e 'use re "debug"; /Muster/;'
bzw
 perl -e 'use re "debug"; "Teststring" =~ /Muster/;'
 
Nach etwas zwischenzeitlichem Nachdenken:
Code:
perl -n -e 'print $_ if /(?!.*tralla)^.*denie.*$/;' /var/www/datei.txt
Das ist aber alles andere als elegant. Ob "tralla" vor oder nach "denie" kommt spielt (im Gegensatz zu deinem versuchten Lösungsansatz) keine Rolle da der Zeiger auf den String natürlich nach dem Lookahead wieder auf den Anfang zurückgesetzt wird.
egrep kennt übrigens kein Lookahead, siehe z.b. Regexp Syntax Summary
 
Last edited by a moderator:
Ja, oder man grep...zumindest wird es dort nicht aufgeführt.

Aber danke für Deinen Versuch!

Falls noch jemanden etwas tolles einfällt - der beauty contest für den schönsten regulären Ausdruck ist noch eröffnet :)

Grüße
Sinepp
 
Wenn dein grep die Option "--perl-regexp" unterstützt ist mein Vorschlag doch schon die fertige Lösung. Ansonsten ist es mit nur einem grep nicht möglich.
Ja, oder man grep...zumindest wird es dort nicht aufgeführt.
Du hast oben dennoch Lookahead und grep kombiniert, heißt das du hast erst jetzt die Manpage gelesen?
Falls noch jemanden etwas tolles einfällt - der beauty contest für den schönsten regulären Ausdruck ist noch eröffnet :)
Spätestens jetzt hört es sich IMHO so an als du deine Hausaufgabe nicht alleine lösen kannst/willst und sie deshalb hier postest...
 
Last edited by a moderator:
Hi Hornox,

genau das Gegenteil. Ich wollte auf

egrep kennt übrigens kein Lookahead, siehe z.b.

mit

oder man grep...zumindest wird es dort nicht aufgeführt.

antworten. Damit wollte ich darauf hinweisen, dass ich mich sehr wohl mit man-pages beschäftigt habe. Obwohl ich zugegebenermaßen die meiste Zeit mit Tutorials für reguläre Ausdrücke verbracht habe.

Aber jetzt kommt noch das beste: Ich habe bei Deinem zweifachen Post aus welchen Gründen auch immer nur den zweiten gelesen - und den fand ich nicht schön - und den ersten Post mit dem debuggen von Perl Ausdrücken überlesen. Von daher: Schließe ich den Contest und danke Dir vielmals für die Unterstützung.

Grüße
Sinepp

P.s.:
Du hast oben dennoch Lookahead und grep kombiniert, heißt das du hast erst jetzt die Manpage gelesen?
Teilweise mit der falschen Reihenfolge vorgegangen: Erst über reguläre Ausdrücke "gelernt", dann angewendet, dann gelesen warum es nicht geht in (e)grep.

P.s.s.: Mit ?! kommt bei mir:
bash: !favicon: event not found
 
Last edited by a moderator:
Back
Top