[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Regular Expression bei Dateiendungen mit find



On Monday 21 August 2006 14:15, Thorsten Hamester wrote:
> Hallo Liste
> nochmal ne Frage zu Dateiendungen.
> Wie muss ein Ausdruck ausschauen der sowohl .jpg als auch .jpeg
> einbindet (jp[eg]) sieht alle jpg-Dateien aber keine jpeg-Dateien
> (jp[eg][g]) sieht nur jpeg-Dateien
> (jp[eg]*) sieht .jpg und .jpeg aber auch jpeg.converted.png die ich aber
> nicht will.
>
Du musst dir überlegen, was der Unterschied zwischen jpg und jpeg ist.
Der besteht ausschließlich in einem hinzugekommenen e in jpeg
Entsprechend muss die RegEx folgendes leisten: matche jpg oder jpeg, 
m.a.W.: matche j, danach p, danach evtl. aber nicht notwendig ein e, 
danach ein g. Alle, außer dem e, müssen auftauchen --> du musst beim e 
einen Quantifizierer hinzufügen, der genau das sagt, nämlich dass e 
auftauchen kann, aber nicht muss.
Das ist ganz einfach jpe?g, Klammern brauchst du dafür nicht:
find -regex ".*jpe?g"
liefert das gleiche wie
find -regex ".*jp[e]?g"

Eckige Klammern dagegen benutzt du, wenn du nach Zeichenklassen suchst: 
[0-9] für alle Buchstaben zwischen 0 und 9, [a-z] für alle Kleinbuchstaben 
usw.
D.h., jp[eg] matcht jpe oder jpg, jp[eg][g] matcht jpeg oder jpgg und, 
jetzt wirds ein bisschen kompliziert: Wieso matcht jp[eg]* auch 
jpeg.converted.png? 
Das tut er, weil Quantifier "greedy" sind. Der Ausdruck heißt: kein, ein 
oder mehrere e oder g und zwar solange, bis du fündig wirst (das meint 
"greedy"!!!). e und g gibts nicht nur in jpe?g, sondern auch in 
converted.png, ergo matcht er die, gierig wie er ist.
Got it?
Gruß Gebhard

Ach ja, die runden Klammern: das würde jetzt ausufern, zum weiterforschen 
nur soviel: [abc] liefert zwar dasselbe wie (a|b|c), kann aber auch ein 
ziemlicher Unterschied sein. Du brauchst es i.d.R., wenn du im 
Ersetzungsteil etwas aufgreifen willst (Backtracking), oder wenn du im 
Suchteil ganze Wörter hast, z.B. \<(1000|tausend)\> matcht 1000 oder 
tausend



Reply to: