/ / Convierte regex general a bash proof regex - regex, bash, unix

Convierte regex general en regex a prueba de bash - regex, bash, unix

Tengo la siguiente expresión regular que comprueba una política de contraseña. Está validado para funcionar:

(^([zZ]d{3})*$)|((?=.{9,})(?=.*?[^ws])(?=.*?[0-9])(?=.*?[A-Z]).*?[a-z].*)

Quiero usar la expresión regular en un script bash para validar un psssword de la siguiente manera:

echo $password | grep "(^([zZ]d{3})*$)|((?=.{9,})(?=.*?[^ws])(?=.*?[0-9])(?=.*?[A-Z]).*?[a-z].*)"
if [[ $? -eq 0 ]] ; then

Esto no funciona en bash. Mi pregunta es :

¿Cómo convierto este regex "puro" a uno quetrabajar en bash? ¿Qué caracteres necesito para escapar? ¿Cuál es la forma correcta de pasar la expresión regular a grep? ¿Hay alguna otra cosa que deba tener en cuenta?

Gracias

Respuestas

2 para la respuesta № 1

Esto puede ser difícil.

Estándar grep tiene capacidades limitadas. Solo admite expresiones regulares extendidas POSIX que no reconocen la afirmaciones de búsqueda anticipada su expresión regular se basa en.

Si tienes gnu grep En tu máquina, puedes pasarla -P o --perl-regexp parámetro, lo que le permite utilizar expresiones regulares compatibles con Perl. Entonces tu expresión regular debería funcionar.

Como se mencionó en mi comentario, la expresión regular tal como está no es adecuada para la validación de contraseñas. Permite contraseñas como z000 o incluso la cadena vacía:

(                 # Either match and capture...
^                #  Start of the string
(                #  Match (and capture, uselessly in this case)
[zZ]            #  case-insensitive z
d{3}           #  three digits
)*               #  zero(!) or more times
$                #  until the end of the string
)                 # End of first group.
|                 # OR
(                 # match and capture...
(?=.{9,})       #  a string that"s at least 9 characters long,
(?=.*?[^ws])  #  contains at least one non-alnum, non-space character,
(?=.*?[0-9])    #  at least one ASCII digit
(?=.*?[A-Z])    #  at least one ASCII uppercase letter
.*?[a-z].*      #  and at least one ASCII lowercase letter
)                 # no anchor to start/end of string...

Mejor uso

^(?=.{9})(?=.*?[^ws])(?=.*?[0-9])(?=.*?[A-Z]).*?[a-z].*$