PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : case anweisung mit regex?



meinereinerseiner
02-03-2010, 09:35
Hi,

ich würde gern in einer Case Anweisung mit wildcards arbeiten. Sprich alles was dem musster foo-1 bis foo-99 entspricht soll im ersten block abgearbeitet werden, ein foo-12.bla oder foo-1y aber vom 2.

nun dachte ich mir das in etwa so:

case $1 in

foo-([0-9]{1,2}))
echo foo
;;

*) # default
echo bar
;;
esac


das tut aber nicht. hat jemand eine idee?

thx,
tom

jeebee
02-03-2010, 12:34
Das offensichtliche Problem ist, dass foo-([0-9]{1,2}) Ausdrücke wie foo-12, foo-73, foo-51 auch matcht.

edit: obs weitere Probleme gibt, kann ich gerade nicht sagen, hab keine Shell zum testen da.

meinereinerseiner
02-03-2010, 13:06
Das offensichtliche Problem ist, dass foo-([0-9]{1,2}) Ausdrücke wie foo-12, foo-73, foo-51 auch matcht.

genau das soll er ja tun - quasi foo-1 - foo-99 ,alle ein und zweistelligen zahlen welche am ende alleine stehen.


case $1 in

foo-\(\[0-9\]{1,2}\))
echo foo
;;

*) # default
echo bar
;;
esac

tom@devil-ng:~/tmp> ./case-test.sh foo-1
bar
tom@devil-ng:~/tmp> ./case-test.sh foo-99
bar
tom@devil-ng:~/tmp> ./case-test.sh foo-2-bla
bar

das matcht irgendwie nie.

jeebee
03-03-2010, 10:17
#!/bin/bash

shopt -s extglob

case $1 in
foo-@([0-9]|[0-9][0-9]))
echo foo
;;

*) # default
echo bar
;;
esac

Die patterns für die cases verwenden Pathname Extension (*, ?, [...]) und nicht regex. Mit der shell option extglob werden verschiedene Kombinationsmöglichkeiten aktiviert (siehe man bash). Eine davon ist @(pattern1|pattern2|...) wobei eines der gelisteten Patterns matchen muss, damit der ganze Ausdruck matcht.


simon@gryphon:~ $ ./case-test.sh foo-1
foo
simon@gryphon:~ $ ./case-test.sh foo-99
foo
simon@gryphon:~ $ ./case-test.sh foo-2-bla
bar

HTH jeebee

meinereinerseiner
03-03-2010, 13:31
ahhh - klasse, klappt bestens!

tausend dank,
tom