Anzeige:
Ergebnis 1 bis 5 von 5

Thema: case anweisung mit regex?

  1. #1
    Registrierter Benutzer
    Registriert seit
    08.01.2001
    Beiträge
    242

    Question case anweisung mit regex?

    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:
    Code:
    case $1 in
    
    	foo-([0-9]{1,2}))
    		echo foo
    	;;
    
    	*) # default
    		echo bar
    	;;
    esac
    das tut aber nicht. hat jemand eine idee?

    thx,
    tom

  2. #2
    Registrierter Benutzer Avatar von jeebee
    Registriert seit
    01.01.2005
    Ort
    Bern || Zürich
    Beiträge
    540
    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.
    my very own 128 bit integer
    C4 D3 B8 A8 9E A0 C6 EC 7D EC A8 15 28 D1 92 58
    more information

  3. #3
    Registrierter Benutzer
    Registriert seit
    08.01.2001
    Beiträge
    242
    Zitat Zitat von jeebee Beitrag anzeigen
    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.

    Code:
    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.

  4. #4
    Registrierter Benutzer Avatar von jeebee
    Registriert seit
    01.01.2005
    Ort
    Bern || Zürich
    Beiträge
    540
    Code:
    #!/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.

    Code:
    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
    my very own 128 bit integer
    C4 D3 B8 A8 9E A0 C6 EC 7D EC A8 15 28 D1 92 58
    more information

  5. #5
    Registrierter Benutzer
    Registriert seit
    08.01.2001
    Beiträge
    242
    ahhh - klasse, klappt bestens!

    tausend dank,
    tom

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •