¿Cómo utilizo expresiones regulares en scripts bash?

83

Quiero verificar si una variable tiene un año válido usando una expresión regular. Al leer el manual de bash , entiendo que podría usar el operador = ~

Mirando el ejemplo a continuación, esperaría ver "no OK" pero veo "OK". ¿Qué estoy haciendo mal?

i="test"
if [ $i=~"200[78]" ]
then
  echo "OK"
else
  echo "not OK"
fi
idrosida
fuente
posible duplicado de bash regex con comillas?
salida
Tenga en cuenta que esto estaba fallando debido a la falta de espacios alrededor =~.
fedorqui 'SO deja de dañar'

Respuestas:

116

Se cambió entre 3.1 y 3.2:

Esta es una descripción concisa de las nuevas características agregadas a bash-3.2 desde el lanzamiento de bash-3.1.

Citar el argumento de cadena al operador [[command's = ~ ahora fuerza la coincidencia de cadenas, como con los otros operadores de coincidencia de patrones.

Así que úselo sin las comillas así:

i="test"
if [[ $i =~ 200[78] ]] ; then
    echo "OK"
else
    echo "not OK"
fi
paxdiablo
fuente
1
¿Cómo manejo la situación cuando la expresión regular contiene espacios si no puedo citar? Si la expresión regular es, por ejemplo a +b, informará un error de sintaxis ...
Alderath
5
@Alderath: Úselo a\ \+bpara escapar del espacio y el carácter más.
blinry
8

Necesita espacios alrededor del operador = ~

i = "prueba"
si [[$ i = ~ "200 [78]"]];
entonces
  echo "OK"
más
  echo "no está bien"
fi
michiel
fuente
3
La respuesta de paxdiablo es correcta, agregar espacios aquí no ayuda (ahora también obtiene "no está bien" para 2008, la única cadena que coincide es literalmente "200 [78]").
Marcel Stimberg