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: