linux-l: regexp

Jens Dreger jens.dreger at physik.fu-berlin.de
Di Aug 22 21:34:32 CEST 2000


On Tue, Aug 22, 2000 at 09:06:20AM +0200, Rolf Buenning wrote:
> Nochmal Hallo,
> 
> On Mon, Aug 21, 2000 at 04:58:48 +0200, Rolf Buenning wrote:
> > On Sam, Aug 19, 2000 at 07:06:28 +0200, Dreger Jens Dreger wrote:
> > > On Sat, Aug 19, 2000 at 06:34:41PM +0100, Andre Grueneberg wrote:
> > > > 
> > > > /^((1[7-9]|[23].)\.07|([01].|2[0-3])\.08)\.2000/
> > 
> > Danke, aber leider funktioniert's nicht, oder ich bin zu bloed :(
> > Ich habe (aus Linux-Magazin) ein script 'calc', das mittels awk was
> 
> Also, nach einigem Probieren (Versuch u. Irrtum oder so) behaupte ich,
> dass es mit regexp nicht geht.
>
> Beispiel Juli
> soll liefern 17.07. und alle folgenden bis 31.07.
> 1. Ziffer [1-3]
> 2. Ziffer [0-9]  wegen 20., 21. ....
> Also ^[1-3][0-9]\.07\.
> Das liefert aber _auch_ 10.7....16.07. :(

Monat Juli:
1.Ziffer 1, dann 2.Ziffer 7-9
(1[7-9])

1.Ziffer 2, dann 2.Ziffer 0-9
(1[7-9]|2[0-9])

1.Ziffer 3, dann 2.Ziffer 0-1
(1[7-9]|2[0-9]|3[0-1])\.07

Da es keine Daten groesser 31 gibt, redundant:

(1[7-9]|[23][0-9])

Monat August:
1.Ziffer 0, dann 2.Ziffer 1-9
(0[1-9])

1.Ziffer 1, dann 2.Ziffer 0-7
(0[1-9]|1[0-7])


=> (1[7-9]|[23][0-9])\.07|(0[1-9]|1[0-7])\.08

Test:
for i in 7 8; do printf "%02d.0$i\n" `seq 1 31`; done > dates.dat
grep "\(1[7-9]\|[23][0-9]\)\.07\|\(0[1-9]\|1[0-7]\)\.08" dates.dat

17.07
[...]
17.08

> Also bleibt nur perl, so wie Jens es geschrieben hat, das funktioniert
> genau.
> Na, ja, war ein Versuch.
> Oder liege ich da falsch?

Ein wenig ;-)

Mit egrep kannst Du's etwas schoener schreiben:
grep "(1[7-9]|[23][0-9])\.07|(0[1-9]|1[0-7])\.08" dates.dat

Gruss,

Jens.



Mehr Informationen über die Mailingliste linux-l