Mira esto si bloque:
#!/bin/bash
str="m.m"
if [[ "${str}" =~ "m\.m" ]]; then
echo "matched"
else
echo "not matched"
exit 1
fi
exit 0
Esto debería imprimir "emparejado", pero no lo hace. ¿A dónde me estoy yendo mal?
Mira esto si bloque:
#!/bin/bash
str="m.m"
if [[ "${str}" =~ "m\.m" ]]; then
echo "matched"
else
echo "not matched"
exit 1
fi
exit 0
Esto debería imprimir "emparejado", pero no lo hace. ¿A dónde me estoy yendo mal?
Respuestas:
Debe eliminar la cita en la coincidencia de expresiones regulares.
if [[ ${str} =~ m\.m ]]; then
Desde la página de manual de bash:
[...] Un operador binario adicional, = ~, está disponible, con la misma precedencia que == y! =. Cuando se usa, la cadena a la derecha del operador se considera una expresión regular extendida y se corresponde en consecuencia (como en regex (3)). El valor de retorno es 0 si la cadena coincide con el patrón y 1 en caso contrario. Si la expresión regular es sintácticamente incorrecta, el valor de retorno de la expresión condicional es 2. Si la opción de shell nocasematch está habilitada, la coincidencia se realiza sin tener en cuenta el caso de los caracteres alfabéticos. Se puede citar cualquier parte del patrón para forzarlo a que coincida como una cadena.
Entonces, con las comillas, estás usando una buena coincidencia de cadenas.
Si necesita espacios en el patrón, simplemente escape de ellos:
str="m m"
if [[ ${str} =~ m\ +m ]]; then
\
.
${str} =~ "needle"[0-9]{1}
o debería usarla ${str} =~ needle[0-9]{1}
?