Esta es mi primera vez bash scripting, así que probablemente estoy cometiendo un error fácil.
Básicamente, estoy tratando de escribir un script que obtenga los grupos de un usuario, y si están en un grupo determinado, lo registrará en consecuencia. Evidentemente habrá más funcionalidades, ¡pero no tiene sentido construir eso cuando ni siquiera puedo hacer que la expresión regular funcione!
Hasta ahora, tengo esto:
#!/bin/bash
regex="^([a-zA-Z0-9\-_]+ : [a-zA-Z0-9\-_]+) (usergroup)$"
# example output
groups="username : username usergroup"
echo "$groups" >> /home/jrdn/log
if [[ "$groups" =~ $regex ]]; then
echo "Match!" >> /home/jrdn/log
else
echo "No match" >> /home/jrdn/log
fi
Todos los lugares donde he probado esa expresión regular, funciona. Pero en el script bash, solo genera el $groups
, seguido de No match
. Entonces, ¿alguien puede decirme qué le pasa?
^([a-zA-Z0-9\-_]+)
luego agregue los dos puntos y así sucesivamente ... debe averiguar muy pronto, ¿dónde está el problema?Respuestas:
De
man 7 regex
:Probar la expresión regular con egrep da un error:
Aquí hay una versión más simple, que también da un error:
Como
\
no es especial, ese es un rango, tal como[a-z]
lo sería. Debe poner su-
al final, como[_-]
o:Esto debería funcionar independientemente de su versión de libc (en egrep o bash).
editar: esto también depende de la configuración regional. La página de manual advierte sobre esto:
Por ejemplo:
Por supuesto, a pesar de que no falló, no está haciendo lo que quieres:
Es una gama, que en ASCII, incluye
\
,[
,^
, y_
.fuente
egrep
no da ningún error, solo coincide correctamente.LC_COLLATE="en_US.UTF-8"
?-
...Regla general con expresiones regulares (y cualquier error en piezas de código más grandes): córtela y reconstruya paso a paso o use bisección, lo que sea mejor para usted.
En este caso, el culpable resultó ser el guión bajo: escapar con una barra invertida lo ha hecho funcionar.
fuente