HOWTO · Bash

Regex Match en Bash

Este tutorial demuestra la coincidencia de expresiones regulares utilizando el operador re-match en bash.

Este tutorial demuestra la coincidencia de expresiones regulares utilizando el operador re-match en bash.

Re-Match Operator en Bash

El operador =~ se conoce como operador de re-coincidencia. Utiliza la siguiente sintaxis.

[[ string =~ regex ]]

El operador de re-coincidencia realiza una coincidencia de expresiones regulares de la cadena de izquierda a derecha. Si el lado izquierdo coincide con el lado derecho, el operador devuelve un 0 y un 1 en caso contrario.

Coincidir números en Bash

El siguiente script comprueba si la variable $greet tiene los caracteres mencionados en el lado derecho, números en nuestro caso. Si hay una coincidencia completa, el operador de re-coincidencia devuelve un 0 y el script imprime la salida correcta.

greet="Hello,World!"

if [[ $greet =~ [0-9] ]]; then
    printf "$greet is a number\n"
else
    printf "$greet is not a number\n"
fi

Dado que el valor de la variable $greet solo tiene caracteres que no sean números, el operador de re-coincidencia devuelve un 1 e imprime el resultado a continuación.

Hello,World! is not a number

Aquí creamos una nueva variable en el script que solo tiene números llamados num. Luego verificamos si la variable num solo tiene números, e imprimimos la salida respectiva dependiendo del valor devuelto por el operador re-match.

#!/bin/env bash

num="2021"


if [[ $num =~ [0-9] ]]; then
    printf "$num is a number\n"
else
    printf "$num is not a number\n"
fi

Dado que la variable num solo tiene números, el operador de re-coincidencia devuelve un 0 y el script imprime la siguiente declaración.

2021 is a number

Regex Coincide con el comienzo de una cadena en Bash

El siguiente script comprueba si el valor de la variable $greet comienza con números. El ^ se utiliza para especificar que coincidan los caracteres al principio de una cadena. Dependiendo del valor devuelto por el operador, imprimimos la salida respectiva.

#!/bin/env bash

greet="123Hello,World!"


if [[ $greet =~ ^[0-9] ]]; then
    printf "$greet starts with a digit(s).\n"
else
    printf "$greet does not start with a digit(s)\n"
fi

Dado que el valor de la variable $greet comienza con un número, el operador devuelve un 0 e imprime el resultado a continuación.

123Hello,World! starts with a digit(s).

Establezcamos $greet en un nuevo valor como se muestra a continuación y ejecutemos el script.

#!/bin/env bash

greet="Hello,World!123"

if [[ $greet =~ ^[0-9] ]]; then
    printf "$greet starts with a digit(s).\n"
else
    printf "$greet does not start with a digit(s)\n"
fi

El operador bash devolverá 1 ya que la cadena de la variable, $greet, no comienza con un número. El script imprimirá el resultado que se muestra a continuación.

Hello,World!123 does not start with a digit(s)

Regex Coincide con el final de una cadena en Bash

El siguiente script comprueba si el valor de la variable $greet termina con números. El $ se utiliza para especificar que coincidan los caracteres al final de la cadena.

La salida que se imprimirá dependerá del valor devuelto por el operador de re-coincidencia.

#!/bin/env bash

greet="Hello,World!123"


if [[ $greet =~ [0-9]$ ]]; then
    printf "$greet ends with a digit(s).\n"
else
    printf "$greet does not end with a digit(s)\n"
fi

El valor de la cadena en la variable $greet termina con números. El operador de re-coincidencia devuelve un 0 y el script imprime la salida a continuación.

Hello,World!123 ends with a digit(s).

Cambiemos el valor de la variable $greet como se muestra en el siguiente script.

#!/bin/env bash

greet="123Hello,World!"

if [[ $greet =~ [0-9]$ ]]; then
    printf "$greet ends with a digit(s).\n"
else
    printf "$greet does not end with a digit(s)\n"
fi

Dado que la cadena de la variable $greet no termina con un número o números, el operador de re-coincidencia devuelve 1 y el script imprime la salida a continuación.

123Hello,World! does not end with a digit(s)

Regex Match Email en Bash

Para hacer coincidir correos electrónicos, generalmente se utiliza el patrón regex ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$.

#!/bin/env bash

email="example@delftstack.com"


if [[ $email =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$ ]]; then
    printf "$email is a valid email.\n"
else
    printf "$email is not a valid email.\n"
fi

El resultado a continuación muestra un correo electrónico que se verificó y pasó la verificación.

example@delftstack.com is a valid email.

Eliminemos el .com al final del correo electrónico como se muestra a continuación y ejecutemos el script.

#!/bin/env bash

email="example@delftstack"


if [[ $email =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$ ]]; then
    printf "$email is a valid email.\n"
else
    printf "$email is not a valid email.\n"
fi

El correo electrónico no pasa la prueba porque no tiene la última parte, el .com.

example@delftstack is not a valid email.