Curso de Programaci贸n en Bash Shell

Curso de Programaci贸n en Bash Shell

Marco Antonio Toscano Freire

Marco Antonio Toscano Freire

Expresiones Regulares

13/43

Lectura

Cuando se solicita ingresar informaci贸n trav茅s de un programa por parte del usuario que est谩 utilizando el programa, independientemente el lenguaje que est茅 realizado; es importante considerar la validaci贸n de la informaci贸n no solo en su tama帽o sino tambi茅n en los tipos de datos, formatos soportados lo cual nos permite asegurar la calidad de la informaci贸n que recibimos, almacenamos y procesamos.

Dentro de este contexto en la programaci贸n bash para cumplir con este objetivo se utiliza expresiones regulares, las cuales son b谩sicamente cadenas de caracteres que definen un patr贸n de b煤squeda que se valida frente a una informaci贸n espec铆fica para asegurar que cumple la validaci贸n definida.

Se necesita conocer ciertos criterios utilizados en las expresiones regulares que son los siguientes:

  • ^.- Caracter que representa el inicio de la expresi贸n regular.
  • $.- Caracter que representa el final de la expresi贸n regular.
  • *.- Caracter que representa cero o m谩s ocurrencias de la expresi贸n
  • +.- Caracter que representa una o m谩s ocurrencias de la expresi贸n.
  • {n}.-Representa n veces de una expresi贸n.
  • [ ] .- Representa un conjunto de caracteres, por ejemplo: [a-z] representa las letras del abecedario de la a a la z.

Tomando en cuenta estos criterios se realizar谩 un programa que valida la siguiente informaci贸n:
N煤mero de Identificaci贸n de un tama帽o de 10 n煤meros. Ejemplo: 1717836520
Pa铆s de Origen denotado por dos letras en un rango espec铆fico. Ejemplo: EC, CO, US
Fecha de Nacimiento en el formato yyyyMMDD. Ejemplo: 20181222

Primero se definir谩 las expresiones regulares y se solicitar谩 la informaci贸n del usuario:

Captura de pantalla 2019-01-16 a la(s) 15.58.48.png

Luego se validar谩 cada expresi贸n regular comenzando con la identificaci贸n, para lo cual para cada validaci贸n se utilizar谩 la sentencia condicional if y para comparar la expresi贸n se debe utilizar el siguiente formato especial if [[ $variable =~ $expresionRegular ]] como se muestra a continuaci贸n.

Captura de pantalla 2019-01-16 a la(s) 15.59.26.png

Se realizar谩 la ejecuci贸n de la aplicaci贸n con los dos escenarios el correcto y el incorrecto como se muestra a continuaci贸n:

Captura de pantalla 2019-01-16 a la(s) 15.59.55.png

Finalmente el c贸digo fuente lo pueden encontrar en el repositorio de GitHub en el branch 7.ValidarInformacion

Aportes 66

Preguntas 5

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

Beco (Alberto Alcocer) tiene un excelente curso de expresiones regulares.

Hay que tener cuidado con los [[ toca dejar un espacio obligatoriamente o si no da errores de command no found.

Cometi un error al llamar la variable de regex y la expresion daba to como valido

Solo como recomendaci贸n, utilicen im谩genes mas grandes

la chuleta, el machete, el acordeon y el bandoneon! porque es este curso va bien como el tango
[http://w3.unpocodetodo.info/utiles/regex.php]

Leyendo comentarios mas abajo, me percato que el REGEX de la fecha no es del todo correcta puesto que no valida escenarios de fechas no validos es decir, si nosotros ingresamos una fecha como 1999 21 35 quitando los espacios, nos la toma como valida.
Por ello leyendo comentarios y viendo el aporte de un companero les anexo como quedaria con la validacion de fechas, supongo que ya con sentencias if podemos validar con un regex especial para validar para los meses con 30 dias y asi.

#! bin/bash
#Ejercicio de Ejemplo uso Regex
#Autor: Sergy Lopez

regexNum='^[0-9]{10}$' #valida numeros de longitud 10
paisRegex='^EC|COL|US$'
dateRegex='^(19|20)([0-9]{2})(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])$' #valida >

echo "Expresiones Regulares"
read -p "Ingresa un Id: " id
read -p "Ingresa las Iniciales del Pais: " pais
read -p "Ingresa una fecha yyyymmdd: " date

#Validamos la informacion

if [[ $id =~ $regexNum ]]; then
        echo "ID: $id valido"
else
        echo "ID: $id invalido"
fi

if [[ $pais =~ $paisRegex ]]; then
        echo "Pais: $pais valido"
else
        echo "Pais: $pais invalido"
fi

if [[ $date =~ $dateRegex ]]; then
        echo "Fecha: $date valida"
else
        echo "Fecha: $date invalida"
fi

Hay que tener presente la sintaxis [[ $a =~ $aRegex ]] se deben respetar los espacios alrededor de 鈥=~鈥 para que funcione correctamente.

Despu茅s de unos 192 intentos, finalmente qued贸 perfecto鈥

code:

#!/bin/bash

#capturing user input and validating stuff on it

#ID: can't have more than 10 number and can only be characters 0-9
#Country: can only be in a range of 2 letters (ex: CO, US, EC) is an specific range
#Date of birht: can only be in format yyyyDDMM (ex: 20181222)

#NOTE: regex = regular expression
id_regex='^[0-9]{10}$'		#^beggining $end
country_regex='^EC|CO|US|MX$'
#	              year             month                day
birth_regex='^(19|20)([0-9]{2})(0[1-9]|1[1-2])(0[1-9]|1[0-9]|2[0-9]|3[0-1])$'	#the numbers before the [] mean a constant, so therefore in the case of (0[1-9]|1[1-2]) we have N1N2 and N1 can only be 0 or 1 and N2 can be a num from 1-9 if N1 = 0 or 1-2 if = 1
#2010/03/30
echo ""
echo "卢------------------------卢"
echo "Welcome!"
echo "Before passing please enter the following information (mandatory)"

echo ""
read -p "ID: " u_id
read -p "Country of origin [EC, CO, US, MX]: " u_country
read -p "Birth date [yyyyMMDD]: " u_bdate
echo ""

#NOTE: The ~ is actually part of the operator =~ which performs a regular expression match of the string to its left to the extended regular expression on its right
#id validation
if [[ $u_id =~ $id_regex ]]; then
	echo -e "ID ($u_id) - status:\t\t\tAPPROVED"
else
	echo -e "ID ($u_id) - status:\t\t\t\tDENIED (check format)"
fi

#country validation
if [[ $u_country =~ $country_regex ]]; then
	echo -e "Country of origin ($u_country) - status:\t\tAPPROVED"
else
	echo -e "Country of origin ($u_country) - status:\t\tDENIED (check format)"
fi

#birth date validation
if [[ $u_bdate =~ $birth_regex ]]; then
	echo -e "Birth date ($u_bdate) - status:\t\t\tAPPROVED"
else
	echo -e "Birth date ($u_bdate) - status:\t\t\tDENIED (check format)"
fi

echo ""

output:

卢------------------------卢
Welcome!
Before passing please enter the following information (mandatory)

ID: 1987345026
Country of origin [EC, CO, US, MX]: CO
Birth date [yyyyMMDD]: 20010230

ID (1987345026) - status:			APPROVED
Country of origin (CO) - status:		APPROVED
Birth date (20010230) - status:			APPROVED

Al final del curso voy a dejar algo as铆 como un git rep para los que est茅n interesados en tener una wiki a la que acudir caundo necesitan ayuda

Las expresiones regulares son un tema que me llama mucho la atencion y se pueden aplicar en muchos si no en todos los lenguajes, evitan un conditional hell

Mi aporte:

Utilizen esta pagina para comprobar/armar sus expresiones regulares:

REGEXR

y aqui las expresiones que arme:

  • ^\d{10}$

  • ^(EC|CO|US)$

  • ^(19\d{2}|[2-9]\d{3})(0[1-9]|1[0-2])([01][1-9]|[12]\d|3[01])$

El unico detalle con la fecha de nacimiento es que no valida biciestos ni la cantidad de dias en el mes por lo que expresiones como 19900230, 20010231 etc, son correctas

Adicional cambien \d por [[:digit:]] o [0-9] o no les funcionaran las expresiones, volvi a subir el aporte por ver ese error

#!/bin/bash
#Programa para ejemplificar como capturar la informacion del usuario y validarla utilizando expresiones regulares
#Autor: Marcelo R.

identificacionRegex='^[0-9]{10}$'
paisRegex='^EC|COL|US$'
#fechaNacimientoRegex='^19|20[0-8]{2}[1-12][1-31]$'
fechaNacimientoRegex='^(19|20)([0-9]){2}(0[1-9]|1[0-2](0[1-9]|[1-2][0-9]|3[0-1])$'

echo "Expresiones regulares"
read -p "Ingresar una identificacion: " identificacion
read -p "Ingresar las iniciales de un Pais [EC, COL, US]: " pais
read -p "Ingresar la fecha de nacimiento [yyyyMMdd]: " fechaNacimiento

#Validacion Identificacion
if [[ $identificacion =~ $identificacionRegex ]]; then
    echo "Identificacion $identificacion valida"
else
    echo "Identificacion $identificacion invalida"
fi

#Validacion Pais
if [[ $pais =~ $paisRegex ]]; then
    echo "Pais $pais valida"
else
    echo "Pais $pais invalido"
fi

#Validacion Fecha de Nacimiento
if [[ $fechaNacimiento =~ $fechaNacimientoRegex ]]; then
    echo "Fecha Nacimiento $fechaNacimiento valida"
else
    echo "Fecha Nacimiento $fechaNacimiento invalida"
fi

En la regex del profe no se puede colocar 2009 como a帽o o si? veo que solamente puede agregar digitos del 0 al 8

Mi soluci贸n al reto

Repositorio

#!/bin/bash
# Program:
#   This program allows you to capture user input and validate it against a regular expression.
# Validations:
#   - The user id must enter a number with size of 10 digits.
#   - The user origin must enter a valid country code.
#   - The user birth date must enter a valid date in the format yyyyMMDD.
# Path: 2_interactive_scripts/3_regular_expressions.sh
# Author:
#  Cristian Rinc贸n
#
# How to run this script:
# ./2_interactive_scripts/3_regular_expressions.sh

user_id=""
user_origin=""
user_birth_date=""

# Regular expression to validate user id.
regex_user_id="^[0-9]{10}$"
# Regular expression to validate user origin.
regex_user_origin="^[A-Z]{2}$"
# Regular expression to validate user birth date.
regex_user_birth_date="^[0-9]{8}$"

echo "RegEx program to validate user id, origin and birth date."

read -p "Enter user id: " user_id
read -p "Enter user origin: " user_origin
read -p "Enter user birth date: " user_birth_date

if [[ $user_id =~ $regex_user_id ]]; then
    echo "User id is valid."
else
    echo "User id is not valid."
fi

if [[ $user_origin =~ $regex_user_origin ]]; then
    echo "User origin is valid."
else
    echo "User origin is not valid."
fi

if [[ $user_birth_date =~ $regex_user_birth_date ]]; then
    echo "User birth date is valid."
else
    echo "User birth date is not valid."
fi

La expresion regular referente a la fecha no funciona bien. Estuve investigando el por que de esto. Al definir un rango [1-12] en realidad estamos haciendo esto [1-2]. Las expresiones no entienden mas all谩 del rango [0-9]. Tambien que debemos agrupar los valores 19 y 20 en un parentesis para que se entienda que debe ejecutar primero esa busqueda y luego la siguiente. Si no lo hacemos estamos diciendo que ejecute la busqueda de solo un 19 o lo que sigue. Todo esto es seg煤n lo que he investigue y aprendi del curso de expresiones regulares. Dejo mi versi贸n de al expresi贸n referente a la fecha:

^(19|20)[0-9]{2}((0[1-9])|1[0-2])(0[1-9]|1[0-9]|2[0-9]|3[0-1])$

Se puede hacer m谩s precisa con los a帽os pero no quise hacerla m谩s larga. Pero creo que se puede entender lo que quiero decir.

en el if, 驴"=~" significa 鈥渋gual a鈥?, porque para mi significa 鈥渄iferente a鈥

El uso de las expresiones regulares es una herramienta que claramente ayuda a tener m谩s certeza de los datos que se est谩n capturando por parte del usuario para asegurar la ejecuci贸n del c贸digo.

Mi clase favorita hasta ahora

#!/bin/bash

identificationRegex='^[0-9]{10}$'
countryRegex='^EC|COL|US$'
birthdateRegex='^19|20[0-9]{2}[1-12][1-31]$'

echo "Regular expressions"
read -p "Enter a identification: " identification
read -p "Enter a country's initials [EC, COL, US]: " country
read -p "Enter your birthdate: " birthdate

if [[ $identification =~ $identificationRegex ]]; then
    echo "Valid identification: $identification"
else
    echo "Invalid identification: $identification"
fi

if [[ $country =~ $countryRegex ]]; then
    echo "Valid country: $country"
else
    echo "Invalid country: $country"
fi

if [[ $birthdate =~ $birthdateRegex ]]; then
    echo "Valid birthdate: $birthdate"
else
    echo "Invalid birthdate: $birthdate"
fi

Entendido

Adjunto mi versi贸n del code, con while鈥

# ! /bin/bash
# Programa para validar expresiones regulares y el uso de if y while.
# Autor: YoJan

identificacionRegex='^[0-9]{10}$'
paisRegex='^EC|COL|US$'
fechaNacimientoRegex='^19|20[0-8]{2}[1-12][1-31]$'
var=0

echo "Expresiones regulares"

#Validaci贸n Identificaci贸n
while [[ $var -eq 0 ]]; do
        read -p "Ingresar una identificacion: " identificacion

        if [[ $identificacion =~ $identificacionRegex ]]; then
                echo "Identificaci贸n $identificacion v谩lida"
            var=1
                else
                        echo "Identificaci贸n $identificacion inv谩lida"
        fi
done
var=0

#Validaci贸n Pa铆s
while [[ $var -eq 0 ]]; do
        read -p "Ingresar las iniciales de un pa铆s [EC, COL, US]:" pais

        if [[ $pais =~ $paisRegex ]]; then
        echo "Pa铆s $pais v谩lido"
        var=1
        else
                echo "Pa铆s $pais inv谩lido"
        fi
done
var=0

# Validaci贸n Fecha de Nacimiento
while [[ $var -eq 0 ]]; do
        read -p "Ingresar la fecha de nacimiento [yyyyMMdd]:" fechaNacimiento

        if [[ $fechaNacimiento =~ $fechaNacimientoRegex ]]; then
        echo "Fecha Nacimiento $fechaNacimiento v谩lida"
        var=1
                else
                echo "Fecha Nacimiento $fechaNacimiento inv谩lida"
        fi
done
#! /bin/bash 
#Programa para ejemplificar como capturar informacion del usuario y validarla utilizando expresiones regulares
# Autor: Joel Nieto G贸mez - [email protected]
#N煤mero de identificacion de un tama帽o de 10 numeros. Ejemplo:1987345026
identificacionRegex='^[0-9]{10}$'
#Pais de origen denotado por dos letras en un rango especifico. ejemplo: MX, US, CO.
paisRegex='^MX|US|CO|EC$'
#Fecha de nacimiento en el formato yyyymmdd. ejemplo: 20200619
fechaNacimientoRegex='^(19|20)([0-9]{2})(0[1-9]|1[1-2])(0[1-9]|1[0-9]|2[0-9]|3[0-1])$'
#Solicitar los datos al usuario
echo "Expresiones Regulares"
read -p "Ingresar una identificaci贸n:" identificacion
read -p "Ingresar las iniciales de un pa铆s [MX|US|CO]:" pais
read -p "Ingresar la fecha de nacimiento [yyyyMMdd]:" fechaNacimiento
#validacion Identifiaci贸n
if [[ $identificacion =~ $identificacionRegex ]]; then
    echo "Identificaci贸n $identificacion v谩lida"
else
    echo "Identificaci贸n $identificacion inv谩lida"
fi
#Validacion Pa铆s
if [[ $pais =~ $paisRegex ]]; then
    echo "Pa铆s $pais v谩lido"
else
    echo "Pa铆s  $pais invalido"
fi
#Validaci贸n Fecha de Nacimiento
if [[ $fechaNacimiento =~ $fechaNacimientoRegex ]]; then
    echo "Fecha Nacimiento $fechaNacimiento v谩lida"
else
    echo "Fecha Nacimiento $fechaNacimiento inv谩lida"
fi                                                                                                                                                                    

Recuerden el comando

$yy$nyy
y
$p

para copiar y pegar el c贸digo y sea m谩s f谩cil el poner los 鈥渋fs鈥 de este programa.

Comparto mi version del script.
Como mencionan los compa帽eros, es necesario reformular la sintaxis de validacion de la fecha:

#!/bin/bash

identificacionRegex='^[0-9]{10}$'
paisRegex='^EC|COL|US$'
fechaNacimientoRegex='^(19|20)[0-9]{2}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])$'

echo "Expresiones Regulares"
read -p "Ingresar una identificacion: " identificacion
read -p "Ingresar las iniciales de un pais [EC, COL, US]: " pais
read -p "Ingresar la fecha de nacimiento [yyyyMMdd]: " fechaNacimiento

# Validacion de Identificacion
if [[ $identificacion =~ $identificacionRegex ]]; then
    echo "Identificacion $identificacion Valida"
else
    echo "Identificacion $identificacion Invalida"
fi

# Validacion de Pais
if [[ $pais =~ $paisRegex ]]; then
    echo "Pais $pais Valido"
else
    echo "Pais $pais Invalido"
fi

# Validacion de Fecha Nacimiento
if [[ $fechaNacimiento =~ $fechaNacimientoRegex ]]; then
    echo "Fecha de Nacimiento $fechaNacimiento Valida"
else
    echo "Fecha de Nacimiento $fechaNacimiento Invalida"
fi

  1 #!/bin/bash
  2 #Programa para ejemplificar como capturar la informacion del usuario y validarla utlilizando
  3 #regex.
  4 
  5 #by levi
  6 
  7 
  8 idRegex='^[0-9]{10}$'
  9 countryRegex='^MX|US|COL$'
 10 dobRegex='19|20[0-99]{2}[1-12][1-31]$'
 11 
 12 echo -e "\n ******REGEX_ VALIDATOR*******"
 13 read -p "Ingresa una Identificacion:  " id
 14 read -p "Ingresa iniciales del pa铆s (MX|US|COL): " pais
 15 read -p "Ingresa fecha de nacimiento: " dob
 16 
 17 #Validar Id
 18 if [[ $id =~ $idRegex ]]; then
 19     echo -e "\n Identificacion $id --> Valida"
 20 else
 21     echo -e "\n Identificacion $id --> Invalida"
 22 fi
 23 
 24 #Validacion Pais
 25 if [[ $pais =~ $countryRegex ]]; then
 26     echo -e "\n Pais $pais --> Valido"
 27 else
 28     echo -e "\n Pais no valido $pais --> Invalido"
 29 fi
 30 
 31 #Validar fecha de nacimiento
 32 
 33 if [[ $dob =~ $dobRegex ]]; then
 34     echo -e "\n Fecha de Nacimiento $dob --> Valida"
 35 else
 36     echo -e "\n Fecha de Nacimiento no valido $dob --> Invalida"
 37 fi```

Entre lo cagado que fue leer el c贸digo de ejemplo, y ver que lo de la fecha no funcionaba como deber铆a, no quedo mas que buscar por otro lado. Y as铆 es como qued贸 mi c贸digo:

#!/bin/bash
# Programa para ejemplificar c贸mo pacturar la informaci贸n del usuario y validarla utilizando expresiones regulares.
# By: Rafael Baculima - [email protected]

identificationRegex='^[0-9]{10}$'
countryRegex='^EC|COL|US$'
birthdayRegex='^[0-9]{4}/[0-9]{2}/[0-9]{2}$' 

echo "Exprensions regulares"
read -p "Ingresar un n煤mero de identificaci贸n: " identification 
read -p "Ingresar las iniciales de un pa铆s [EC|COL|US]: " country 
read -p "Ingresar la fecha de nacimiento [yyyy/MM/dd]: " birthday 

# Validaci贸n de la identificaci贸n 
if [[ $identification =~ $identificationRegex ]]; then
    echo "$identification es una identifaci贸n v谩lida."
else
    echo "$identification no es una identicaci贸n v谩lida."
fi

# Validaci贸n del Pa铆s 
if [[ $country =~ $countryRegex ]]; then
    echo "$country es un pa铆s v谩lido."
else
    echo "$country es un pa铆s no v谩lido."
fi

# Validaci贸n de la fecha de nacimiento
if  [[ $birthday =~ $birthdayRegex ]] && date -d $birthday >/dev/null 2>&1; then # 2>&1 
    echo "$birthday es una fecha v谩lida."
else
    echo "$birthday no es una fecha v谩lida."
fi

Utilicen im谩genes m谩s grandes

No s茅 si soy solo yo, pero no alcanzo a ver lo que dice el c贸digo

Solo hice uno de fechas (cualquier fecha) para recordar sobre expresiones regulares.

#!/bin/bash
# validates any date in the next format yyyy-mm-dd
# it doesn't check how many days are in the actual month
# "-" is a special character, so I write a "\" to escape it
anyYearRegex='^[1-9]([0-9]{0,3})\-(1[0-2])|([0-9])\-(([1-9])|([1-2][0-9])|3[0-1])$'
anyYear=0

read -p "Enter any year" anyYear

if [[ $year =~ $anyYearRegex ]]; then
	echo "Valid year: $anyYear"
else
	echo "Invalid year: $anyYear"
fi

Justo vengo de ese curso y para reforzar quise tomar este xD鈥

Jam谩s me vi usando Linux, codeando en vim, usando expresiones regulares y hasta programando en bash xp鈥

# programa para capturar informacion del usuario y validarla con expresiones regulares                                                                                                                                           
# Autor: Hever Morales                                                                                                                                                                                                           
                                                                                                                                                                                                                                 
    identificacionRegex='^[0-9]{10}$' #acepta solo numeros y que sean 10 caracteres                                                                                                                                              
    paisRegex='^EC|COL|US$' #acepta palabras que inician con esas dos letras                                                                                                                                                     
    fechaNacimientoRegex='^19|20[0-8]{2}[01-12]{2}[01-31]{2}$' #acepta solo fechas validas                                                                                                                                       
    echo "Expresiones Regurales"                                                                                                                                                                                                 
    read -p "Ingrese una identificacion: " identificacion                                                                                                                                                                        
    echo -e "\n"                                                                                                                                                                                                                 
    read -p "Ingrese iniciales del pais [EC, COL, US]: " pais                                                                                                                                                                    
    echo -e "\n"                                                                                                                                                                                                                 
    read -p "Igrese fecha de nacimiento [AAAAMMDD]: " fechaNacimiento                                                                                                                                                            
    echo "identificacion: $identificacion , pais: $pais, fecnac: $fechaNacimiento "                                                                                                                                              
                                                                                                                                                                                                                                 
    if [[ $identificacion =~ $identificacionRegex ]]                                                                                                                                                                             
        then                                                                                                                                                                                                                     
        echo "Identificacion $identificacion Valida"                                                                                                                                                                             
        else                                                                                                                                                                                                                     
        echo "Identificacion $identificacion Invalida"                                                                                                                                                                           
    fi                                                                                                                                                                                                                           
                                                                                                                                                                                                                                 
    if [[ $pais =~ $paisRegex ]]                                                                                                                                                                                                 
        then                                                                                                                                                                                                                     
        echo "pais $pais Valido"                                                                                                                                                                                                 
        else                                                                                                                                                                                                                     
        echo "pais $pais Invalido"                                                                                                                                                                                               
    fi                                                                                                                                                                                                                           
      if [[ $fechaNacimiento =~ $fechaNacimientoRegex ]]                                                                                                                                                                         
        then                                                                                                                                                                                                                     
        echo "fecha de nacimiento $fechaNacimiento Valida"                                                                                                                                                                       
        else                                                                                                                                                                                                                     
        echo "fecha de nacimiento $fechaNacimiento Invalida"                                                                                                                                                                     
    fi                                                                                                                                                                                                                           
                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                 
                                              

Lo unico que modifique fueron las expresiones regulares, me parece lo m谩s optimo para el algoritmo, pero se aceptan cr铆ticas para mejorar el algoritmo.

#!/bin/bash
#Programa para ejemplificar como capturar la informaci贸n del usuario y validarla utilizando expresiones regulares
#Autor: Chanchi

identificacionRegex='^[0-9]{10}$'
paisRegex='^\w{1,3}$'
fechaDeNacimientoRegex='^19|20[0-9]/\s?{2}[1-12]/\s?[1-31]$'

echo -e "Expresiones regulares:\n"
read -p "Ingresar identificacion (sin puntos): " identificacion
read -p "Ingresar las iniciales de un pa铆s, preferiblemente las siguientes [EC/COL/US]: " pais
read -p "Ingresar la fecha de nacimiento [A帽o/Mes/D铆a]: " fechaDeNacimiento

# Validaci贸n Identifiaci贸n
if [[ $identificacion =~ $identificacionRegex ]]; then
    echo "Identificaci贸n $identificacion v谩lida"
else
    echo "Identificacion $identificacion inv谩lido"
fi

# Validaci贸n Pa铆s
if [[ $pais =~ $paisRegex ]]; then
    echo "Pa铆s $pais v谩lida"
else
    echo "Pa铆s $pais inv谩lido"
fi

# Validaci贸n Fecha de Nacimiento
if [[ $fechaDeNacimiento =~ $fechaDeNacimientoRegex ]]; then
    echo "Fecha de nacimiento: $fechaDeNacimiento v谩lida"
else
    echo "Fecha de nacimiento: $fechaDeNacimiento v谩lida"
fi

Buenas [email protected],
he probado a usar la clase predefinida \d y no me funciona pero usando [0-9] si acepta la entrada, por lo visto esto se debe a que las clases \d y \w no funcionan en las expresiones regulares POSIX, en lugar de usar \d podemos usar [0-9] o [[:digit:]] , v茅ase que la segunda forma usa doble [, espero que esto os ayude a no toparos con ese error como yo 馃槂.

隆Excelente curso!

Bueno yo no he tomado el curso de ER, pero con lo que se aprende en este tutorial es como para chicanear un poco, he tenido un problema con la validaci贸n de la fecha de nacimiento, me dice no v谩lida. Seguramente porque us茅 el comando 鈥淓SC + yy鈥 en una l铆nea despu茅s del ELSE y dej茅 sin cambiar esta 煤ltima. Ah profesor, un curso genial 馃槂

Exelent
# ! /bin/bash
# Programa para validar datos ingresados por el usuario con expresiones regulares

identRegex='^[0-9]{10}$'
paisRegex='EC|CO|US$'
feNaRegex='^19|20[0-9]{2}[1-12][1-31]$'
validador=i

clear
echo "Expresiones Regulares"
while [ $validador == i ]
do
    read -p "Ingresar Cedula:" ident
    clear
    if [[ $ident =~ $identRegex ]]; then
        echo "Cedula Valida"
        validador=v
        read -p "Presione Enter para continuar..."
        clear
    else
        echo "Cedula Invalida"
        validador=i
    fi
done
validador=i
while [ $validador == i ]
do
    read -p "Ingresar Pais [EC|CO|US]:" pais
    clear
    if [[ $pais =~ $paisRegex ]]; then
        echo "Pais Valido"
        validador=v
        read -p "Presiones Enter para continuar..."
        clear
    else
        echo "Pais Invalido"
        validador=i
    fi
done
validador=i
while [ $validador == i ]
do
    read -p "Ingresar Cumplea帽os:" cumple
    clear
    if [[ $cumple =~ $feNaRegex ]]; then
        echo "Fecha Valida"
        validador=v
        read -p "Presione Enter para continuar..."
        clear
    else
        echo "Fecha Invalida"
        validador=i
    fi
done
echo "Datos Ingresador:"
echo "Cedula: $ident"
echo "Pa铆s: $pais"
echo "Fecha de Nacimiento: $cumple"

read -p "Presione Enter para salir..."
clear```

Muy bien ! Realizado!

#!/bin/bash
# Programa  para el ejemplo de como capturar info del usuario y validar usando expresiones regulares
# Author: Javier Aviles

identRegex='^[0-9]{10}$'
paisRegex='EC|CO|US$'
feNaRegex='^19|20[0-9]{2}[1-12][1-31]$'
validador=i

clear
echo "Expresiones Regulares"
while [ $validador == i ]
do
    read -p "Ingresar Cedula: (valor numerico entre 10 digitos)..." ident
    clear
    if [[ $ident =~ $identRegex ]]; then
        echo "Muy Bien, Cedula Validada!! "
        validador=v
        read -p "Presione Enter para continuar..."
        clear
    else
        echo "Cedula Invalida... Intente nuevamente"
        validador=i
    fi
done
validador=i
while [ $validador == i ]
do
    read -p "Ingresar Pais [EC|CO|US]:  indique uno de los 3..." pais
    clear
    if [[ $pais =~ $paisRegex ]]; then
        echo "Muy bien, Pais Validado!"
        validador=v
        read -p "Presiones Enter para continuar..."
        clear
    else
        echo "Pais Invalido... Intente nuevamente"
        validador=i
    fi
done
validador=i
while [ $validador == i ]
do
    read -p "Ingresar Cumplea帽os: yyyyMMdd..." cumple
    clear
    if [[ $cumple =~ $feNaRegex ]]; then
        echo "Muy bien, Fecha Validada! "
        validador=v
        read -p "Presione Enter para continuar..."
        clear
    else
        echo "Fecha Invalida... Intente nuevamente..."
        validador=i
    fi
done
echo "Datos Ingresador:"
echo "Cedula: $ident"
echo "Pa铆s: $pais"
echo "Fecha de Nacimiento: $cumple"

read -p "Presione Enter para salir..."
clear

# !/bin/bash
# Validar entradas del usuario seg煤n expresiones regulares
# Autor: Marcos

regex_identificacion='^([0-9]){10}$'
regex_pais='^(EC|DD|US)$'
regex_fecha='^([1-2][0-9][0-9][0-9])(01|02|03|04|05|06|07|08|09|10|11|12)([0-3][0-9])$'

echo 'Expresiones regulares'
read -p "Introduzca identificaci贸n:" identificacion
read -p "Introduzca inicialies de pais [EC, COL, US]:" pais
read -p "Introduzca fecha de nacimiento:" fecha

# Validaci贸n identificaci贸n
if [[ $identificacion =~ $regex_identificacion ]]; then
    echo "Identificaci贸n $identificacion v谩lida"
else
    echo "Identificaci贸n $identificacion inv谩lida"
fi

# Validaci贸n pa铆s
if [[ $pais =~ $regex_pais ]]; then
    echo "Pa铆s $pais v谩lido"
else
    echo "Pa铆s $pais inv谩lido"
fi

# Validaci贸n fecha de nacimiento
if [[ $fecha =~ $regex_fecha ]]; then
    echo "Fecha $fecha v谩lida"
else
    echo "Fecha $fecha inv谩lida"
fi

genial

En mi versi贸n, la validaci贸n se ejecuta inmediatamente despues de cada ingreso de datos.

# ! /bin/bash
# Programa de ejemplo de validaci贸n de captura de datos de usuario y validaci贸n con expresiones regulares.
# Author: Francisco Llanquipichun - https://francisco,llanquipichun.cl

identificacionRegex='^[0-9]{10}$'
paisRegex='^EC|COL|CL|US$'
fechaNacimientoRegex='^19|20[0-8]{2}[1-12][1-31]$'

echo "Validaci贸n con expresiones regulares"
read -p "Ingresar una identificaci贸n de 10 digitos:" id

# Valida ID
if [[ $id =~ $identificacionRegex ]]; then
	echo "Identificacion $id v谩lida"
else
	echo "Identificaci贸n $id fallida"
fi

read -p "Ingresar las iniciales de un pa铆s [EC,COL,CL,US]:" pais

#Validaci贸n Pa铆s
if [[ $pais =~ $paisRegex ]]; then
	echo "Pa铆s $pais v谩lido"
else
	echo "Pa铆s $pais inv谩lido"
fi

read -p "Ingresar la fecha de nacimiento[yyyyMMdd]:" fecha

#Validacion Fecha de Nacimeinto
if [[ $fecha =~ $fechaNacimientoRegex ]]; then
	echo "Nacimiento $fecha v谩lido"
else
	echo "Nacimiento $fecha inv谩lido"
fi

El curso de expresiones regulares les va ayudar mucho a entender eso mejor

Con las expresiones regulares podemos construir y validar la informaci贸n para que nuestros programas corran de la forma que necesitamos. Excelente!

# !/bin/bash
# Programa para validar la informaci贸n del usuario utilizando regex
# Autor: Karen Ramirez

identificacionRegex='^[0-9]{10}$'
paisRegex='^EC|COL|US$'
fechaNacimientoRegex='^19|20[0-9]{2}[1-12][1-31]'

echo "Expresiones regulares"

read -p "Ingresar una identificaci贸n:" identificacion
if [[ $identificacion =~ $identificacionRegex  ]]; then
    echo "Identificaci贸n  $identificacion valida"
else
    echo "Identificaci贸n $identificacion invalida"
fi

read -p "Ingresar las iniciales de un pa铆s [EC | COL | US]:" pais
if [[ $pais =~ $paisRegex ]]; then
    echo "Pais $pais valido"
else
    echo "Pais $pais invalida"
fi


read -p "Ingresar la fecha de nacimiento [yyyyMMDD] :" fechaNacimiento
if [[ $fechaNacimiento =~ $fechaNacimientoRegex  ]]; then
    echo "Fecha de nacimiento $fechaNacimiento valida"
else
    echo "Fecha de nacimiento $fechaNacimiento  invalida"
fi

Si alguien mas tambien ha hecho el curso de expresiones regulares creo que lo que he descubierto le sera util, para saber los detalles que hay en bash

  1. No hay que 鈥渆scapar鈥 los caracteres como -. o con el , se colocan directamente
  2. No se si fue cosa mia pero no me funciono hacer la regex con \d

)

Peque帽o ejercicio para reafirmar:


Excelente ejercicio

#! /bin/bash
# Programa para validar datos por medio del uso de expresiones regulares
# Autor: IvarC29

idRegex='^[0-9]{10}$'
countryRegex='^EC|COL|US$'
dateRegex='^19|20[0-8]{2}[1-12][1-31]$'

echo "Ingresando Datos..."
read -p "Ingrese Identificacion: " id
read -p "Ingrese iniciales del pais [EC, COL, US]: " country
read -p "Ingrese fecha de naciomiento [yyyyMMdd]: " date

echo "Validando..."

if [[ $id =~ $idRegex]]; then
    echo "Identificacion $id valida"
else
    echo "Identificacion $id invalida"
fi

if [[ $country =~ $countryRegex]]; then
    echo "Identificacion $country valida"
else
    echo "Identificacion $country invalida"
fi

if [[ $date =~ $dateRegex]]; then
    echo "Identificacion $date valida"
else
    echo "Identificacion $date invalida"
fi

As铆 qued贸:

identificationRegex=鈥橿[0-9]{10}$鈥
paisRegex=鈥橿EC|COL|US$鈥
birday=鈥橿19|20[0-99]{2}[1-12][1-31]$'
read -p "ingrese la opcion: " leyendo
read -p "ingrese pais: " pais
read -p "ingrese cumple fomato yyyymmdd: " cumple

if [[ $leyendo =~ $identificationRegex ]]; then
echo "identificacion $leyendo valida"
else
echo "identificacion $leyendo invalida"
fi

if [[ $pais =~ $paisRegex ]]; then
echo "pais $pais valida"
else
echo "pais $pais invalida"
fi

if [[ $cumple =~ $birday ]]; then
echo "cumplea帽os $cumple valida"
else
echo "cumplea帽os $cumple invalida"
fi

La primera vez que me tope con una expresi贸n regular no tenia ni idea de como ese mont贸n de caracteres pod铆an funcionar, ahora que lo entiendo, son geniales

En mi opini贸n, me ha gustado mucho este tema, sin embargo, pienso que para la expresi贸n regular de la fecha de nacimiento hace falta cosas, por ejemplo, 19|20 se deber铆a encerrar entre par茅ntesis, ya que de no hacerse, se puede interpretar como si fuera una fecha que empiece por el n煤mero 19 y solo 19 puede funcionar (algo que estar铆a mal ya que no representar铆a una fecha el n煤mero 19) o que sea 20 y todo lo dem谩s que pueda resultar. Por otra parte, tanto para el mes como para el a帽o los rangos no van a funcionar como se espera, debido a que [1-12] no aceptar铆a ni el 10 ni el 11 y tampoco el 12, del 1 al 9 funcionar铆a perfectamente. Mi propuesta es la siguiente:

fechaDeNacimiento='^(19|20)[0-9]{2}([1-9]|10|11|12)[1-9]([1-3][0-9])?$'

S茅 que no es perfecta, pero me ha gustado los resultados que ha arrojado. Aunque el curso no es de expresiones regulares, espero que pueda ayudar.

馃槈

Cuando escriben, no les pasa que no les permite borrar lo que escribieron, 驴hay una forma de quitar eso?

$ ./8_regularExpression.sh
Expresiones Regulares
Ingresar identificacion:
123232^H^H^H^H
#!/bin/bash
#Programa para ejemplificar como capturar la informacion del usuario y validarla utilizando expresiones regulares
#Autor: Brandon Jimenez - [email protected]

identificacionRegex='^[0-9]{10}$'
paisRegex='^EC|COL|US|VEN$'
fechaNacimientoRegex='^(19|20)([0-9]{2})(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])$'

echo "Expresiones Regulares"
read -p "Ingresar una identificacion:" identificacion
read -p "Ingresar las iniciales de un pais [EC, VEN, COL, US]:" pais
read -p "Ingresar la fecha de nacimiento [yyyyMMdd]:" fechaNacimiento

#Validar identificacion

if [[ $identificacion =~ $identificacionRegex ]]; then
    echo "Identificacion $identificacion valida"
else
    echo "Identificacion $identificacion invalida"
fi

#Validacion Pais

if [[ $pais =~ $paisRegex ]]; then
    echo "Pais $pais valido"
else
    echo "Pais $pais invalido"
fi

#Validacion fecha de nacimiento

if [[ $fechaNacimiento =~ $fechaNacimientoRegex ]]; then
    echo "Fecha de nacimineto $fechaNacimiento valida"
else
    echo "Fecha Nacimiento $fechaNacimiento invalida"
fi
~