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

