2010-01-23 16 views
9

Estoy tratando de verificar si una variable tiene exactamente dos números, pero parece que no puedo resolverlo.Regex en KornShell

¿Cómo se comprueban las expresiones regulares (regex) en KornShell (ksh)?

que he intentado:

if [[ $month =~ "[0-9]{2}" ]] 
if [[ $month = _[0-9]{2}_ ]] 

No he podido encontrar ninguna documentación sobre el mismo.

¿Alguna idea?

Respuesta

8
case $month in 
    [0-9][0-9]) echo "ok";; 
    *) echo "no";; 
esac 

debería funcionar.

Si necesita buscar con expresiones regulares, puede utilizar egrep así:

if echo $month | egrep -q '^[0-9]{2}$' 
then 
    echo "ok" 
else 
    echo "no" 
fi 
+0

Durante el uso de egrep va a funcionar, es un programa externo y voluntad ralentizar el script mucho. – user1683793

0

puede probar esta, así

$ month=100 
$ [[ $month == {1,2}([0-9]) ]] && echo "ok" || echo "no" 
no 
$ [[ $month == [0-9][0-9] ]] && echo "ok" || echo "no" 
no 
$ month=10 
$ [[ $month == {1,2}([0-9]) ]] && echo "ok" || echo "no" 
ok 
$ [[ $month == [0-9][0-9] ]] && echo "ok" || echo "no" 
ok 
5

donde vengo, esto es más probable para validar numérica meses:

if (($month >= 1 && $month <= 12)) 

o

[[ $month =~ ^([1-9]|1[012])$ ]] 

o incluir un cero durante meses de un solo dígito:

[[ $month =~ ^(0[1-9]|1[012])$ ]] 
3

ksh no utiliza expresiones regulares; usa un lenguaje más simple pero aún bastante útil llamado "patrones de globbing de conchas". Las ideas fundamentales son

  • Las clases como [0-9] o [chly] cualquier carácter en la clase.
  • El . no es un personaje especial; solo coincide con ..
  • El ? coincide con cualquier carácter.
  • El * coincide con cualquier secuencia de caracteres.
  • A diferencia de las expresiones regulares, los patrones de englobamiento Shell debe coincidir con la palabra toda, por lo que funciona como si fuera una expresión regular que siempre sería empezar con ^ y termina con $.

Los patrones globbing no son tan potentes como las expresiones regulares, pero son mucho más fáciles de leer, y son muy convenientes para unir nombres de archivo y palabras simples. El constructo case es mi favorito para hacer coincidir, pero hay otros.

como ya ha indicado Alok es probable que quieren

case $number in 
    [0-9][0-9]) success ;; 
    *) failure;; 
esac 

Aunque, posiblemente, es posible que prefiera no hacer coincidir un número de dos dígitos con cero inicial, por lo que prefieren [1-9][0-9].

+2

ksh93 admite expresiones regulares tanto básicas como extendidas utilizando el operador de enlace = ~ – cdarke

+1

+1 para explicar las diferencias clave entre expresiones regulares y patrones; @cdarke: es bueno saberlo, pero no puedo admitir expresiones _interval_ como '{2}'; p.ej. '[[11 = ~ [0-9] {2}]] && echo YES' causa un error de sintaxis; '\' -escapar los resultados de llaves no coincide; ¿Me estoy perdiendo algo ('ksh 93u')? – mklement0

7

Ksh ha apoyado patrones extendidos limitados desde ksh88, utilizando la sintaxis

special '(' pattern ')' 

.

En ksh88, los prefijos 'especiales' de carácter cambiar el número de coincidencias se esperaba:

'*' for zero or more matches 
'+' at least one match 
'@' for exactly one match 
'?' for zero or one matches 
'!' for negation 

En ksh93, esto se amplió con

'{' min ',' max '}' 

expresar una gama exacta:

for w in 1423 12 "" abc 23423 9 33 3 333 
do 
    [[ $w == {1,3}(\d) ]] && print $w has between 1 and three digits 
    [[ $w == {2}(\d) ]] && print $w has exactly two digits 
done 

Y, por último, puede tener un montón de perl con '~', que presenta un nuevo la clase de extensiones, incluyendo expresiones regulares completos con:

'~ (E) (expresiones regulares)'

Más ejemplos se pueden encontrar en Finnbarr P. Murphy's blog

+3

No necesita el ~ (E) si usa = ~, ese es el valor predeterminado – cdarke