2009-08-04 28 views
6

Estoy agregando una función a una secuencia de comandos existente que permitirá al usuario configurar el nombre de host de un sistema Linux. Las reglas que estoy hacer cumplir son los siguientes:¿Cómo puedo garantizar que una cadena de Bash sea alfanumérica, sin un guión bajo?

  • debe estar entre 2 y 63 caracteres de longitud
  • no debe comenzar o terminar con un guión
  • sólo puede contener caracteres alfanuméricos y guiones; todos los demás caracteres no están permitidos (incluido un guión bajo, lo que significa que no puedo usar el símbolo \ W regex)

He resuelto los dos primeros en la lista, pero tengo problemas para averiguar cómo para verificar si una cadena de bash contiene solo letras, dígitos y guiones. Creo que puedo hacer esto con una expresión regular, pero estoy teniendo problemas para averiguar cómo (he pasado la última hora buscando en la web y leyendo páginas man).

Estoy abierto a usar sed, grep o cualquiera de las otras herramientas estándar, pero no Perl o Python.

Respuesta

14

parece que esto debería hacerlo:

^[a-zA-Z0-9][-a-zA-Z0-9]{0,61}[a-zA-Z0-9]$ 

cualquier carácter alfanumérico, a continuación, coinciden con hasta 61 caracteres alfanuméricos (incluyendo guiones), entonces cualquier carácter alfanumérico. La longitud mínima de la cadena es 2, la máxima es 63. No funciona con Unicode. Si necesita que funcione con Unicode, deberá agregar diferentes clases de caracteres en lugar de a-zA-Z0-9, pero el principio será el mismo.

creo que la correcta grep expresión que trabajará con Unicode es:

^[[:alnum:]][-[:alnum:]]{0,61}[[:alnum:]]$ 
+1

¿Cómo se utiliza la segunda expresión con grep? Estoy buscando modificadores en la página de manual pero sin éxito: me estoy haciendo eco de una cadena que debe coincidir y no se genera nada. –

+0

@Montecristo: 'grep -E' o' egrep' – Welbog

+0

Lo intenté con esto: echo 1asdas * _- | grep -E '^ [[: alnum:]] [-: alnum:]] {0,61} [[: alnum:]] $', sin salida (también sin comillas simples), lol debería preguntar pregunta, creo ...: P –

1

Esto es para el último que necesita: sed -e 's/[^[:alnum:]|-]//g'

2

Este es un script bash probar el primer parámetro si contiene solo alfanuméricos o guiones. Se "tubos" el contenido de $ 1 en grep:

#!/bin/bash 
if grep '^[-0-9a-zA-Z]*$' <<<$1 ; 
    then echo ok; 
    else echo ko; 
fi 
+0

¿Por qué '^' aquí representa negatividad en lugar de la primera aparición? – Stallman

+0

Significa "principio de línea", por lo que cada carácter entre él y '$' debe ajustarse al patrón. –

0

puede hacerlo con sólo golpe

string="-sdfsf" 
length=${#string} 
if [ $length -lt 2 -o $length -gt 63 ] ;then 
    echo "length invalid" 
    exit 
fi 
case $string in 
    -*) echo "not ok : start with hyphen";exit ;;  
    *-) echo "not ok : end with hyphen";exit ;; 
    *[^a-zA-Z0-9-]*) echo "not ok : special character";exit;; 
esac 
Cuestiones relacionadas