Usando regex dentro si cláusula en bash


10

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:


21

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

pero sin comillas dobles, no podemos usar caracteres de espacio en el patrón regex. ¿Hay alguna solución para eso?
Majid Azimi

1
El espacio se debe escapar como \ .
ДМИТРИЙ МАЛИКОВ

Si quiero encontrar una cadena que termine con un número dinámico, ¿debería usarla ${str} =~ "needle"[0-9]{1}o debería usarla ${str} =~ needle[0-9]{1}?
mgutt 01 de
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.