2012-02-13 12 views
5

He escrito una secuencia de comandos que actualiza una versión en un determinado archivo. Necesito comprobar que la entrada para el usuario está en formato de versión, así que no termino de agregar el número que no se necesita en esos archivos importantes. La forma en que lo hice es agregando un nuevo valor version_check, donde elimino mi patrón de expresiones regulares y luego un control if.Cómo verificar una cadena de entrada en bash está en formato de versión (n1.n2.n3)

version=$1 
version_checked=$(echo $version | sed -e '/[0-9]\+\.[0-9]\+\.[0-9]/d') 

if [[ -z $version_checked ]]; then 
    echo "$version is the right format" 
else 
    echo "$version_checked is not in the right format, please use XX.XX.XX format (ie: 4.15.3)" 
    exit 
fi 

que funciona bien para XX.XX y XX.XX.XX sino que también permite xx.xx.xx.xx y XX.XX.XX.XX.XX etc .. por lo que si el usuario comete un error ingresará datos incorrectos en el archivo. ¿Cómo puedo hacer que el sedgegege SÓLO permita 3 pares de números separados por un punto?

Respuesta

4

Cambiar la expresión regular a partir de:

/[0-9]\+\.[0-9]\+\.[0-9]/ 

a esto:

/^[0-9]*\.[0-9]*\.[0-9]*$/ 
+0

¡Dulce! eso funciona muy bien, muchas gracias – Llanos

+0

De nada. No se olvide de aceptar la respuesta para cerrar este Q & A :) – anubhava

0

Usted puede hacer esto con fiesta pattern matching:

$ for version in 1.2 1.2.3 1.2.3.4; do 
    printf "%s\t" $version 
    [[ $version == +([0-9]).+([0-9]).+([0-9]) ]] && echo y || echo n 
done 

1.2  n 
1.2.3 y 
1.2.3.4 n 

Si necesita cada grupo de dígitos a ser exactamente 2 dígitos:

[[ $version == [0-9][0-9].[0-9][0-9].[0-9][0-9] ]] 
+0

Gracias Glen pero el cambio anterior lo hizo, aplausos de todos modos – Llanos

Cuestiones relacionadas