[linux-l] Re: Regex Frage

Mike Dornberger Mike.Dornberger at gmx.de
Fr Feb 17 21:30:04 CET 2006


Hi,

On Fri, Feb 17, 2006 at 06:27:37PM +0100, JSC wrote:
> On Fri, Feb 17, 2006 at 04:50:24PM +0100, Rocco Rutte wrote:
> > * JSC <belug at jsc.no-ip.org>:
> > 
> > >ich krieg hier noch nen knoten in den kopf. ich brauche EINE regular
> > >expression, die "def" findet, aber nicht "abcdef".
> > 
> > >geht sowas? kann jemand ein beispiel geben, wie das pattern als regex
> > >und extended regex aussieht?
> > 
> > Etwas explizit _nicht_ zu matchen ist relativ kompliziert.
> > 
> > Wenn in jeder Zeile vor dem Match auf 'def' mindestens noch 3 Zeichen 
> > stehen:
> > 
> >    '[^a][^b][^c]def'
> > 
> funktioniert ja nicht, das macht mir ja den knoten in den kopf ...
> 
> $ echo 123def | grep '[^a][^b][^c]def'
> 123def
> $ echo 123bcdef | grep '[^a][^b][^c]def'
> $

nun, ließ genau, was da steht:

!a AND !b AND !c AND (def) = !(a OR b OR c) AND def (jeweils an den
entsrechenden Stellen)

(siehe auch
$ perl -e '@z = ("a", "b", "c"); for $x (1..2**3) { for $y (0 .. 2) { if ($x
& 2**$y) {print $z[$y]} else {print "_";} }; print "def\n"; }' | grep
'[^a][^b][^c]def' )

also entweder
$ echo 123bcdef | grep 
'\([^a]bc\|a[^b]c\|[^a][^b]c\|ab[^c]\|[^a]b[^c]\|a[^b][^c]\|[^a][^b][^c]\)def'

... was natürlich beliebig unübersichtlich wird, wenn du auf (nicht
abcdefg...)DEF matchen willst. Da baust du dir dann am besten ein Script,
was dir die regex schreibt

oder du machst einfach

$ echo 123bcdef | grep -v 'abcdef' | grep def

Gruß,
 Mike



Mehr Informationen über die Mailingliste linux-l