Expresiones regulares en la Shell
Las expresiones regulares son una sintaxis formal para definir patrones de texto. Son como un mini-lenguaje que te permite describir secuencias de caracteres que quieres buscar, coincidir o manipular. Este lenguaje es universal y se implementa en casi todos los lenguajes de programación (Python, Java, JavaScript, Perl, Ruby, C#, PHP etc.) y en muchas herramientas de línea de comandos.
Por su parte, grep
, sed
y AWK
son programas independientes que bash puede ejecutar, capturar su salida y manipularla. Las tres usan expresiones regulares, pero aunque todas ellas están basadas en el standard POSIX, su implementación no es idéntica
Metacaracteres, Patrones y Procesamiento de Texto en Bash
Los metacaracteres y patrones, como los usados en expresiones regulares (regex), se utilizan para buscar, filtrar y manipular texto. Los programas grep
, sed
, y awk
son esenciales para estas tareas, cada uno con un propósito específico. Aqui vamos a ver lo mas esencial de las expresiones regulares, y cual es la utilidad de estos programas, en relación con bash>
La idea general que subyace en las expresiones regulares de cualquier lenguaje es la de comparar un patrón abstracto (aguja) con una cadena de caracteres (pajar) y encontrar coincidencias.
Los metacaracteres comunes incluyen:
.
: Coincide con cualquier carácter.*
: Coincide con cero o más repeticiones del carácter anterior.^
: Coincide con el inicio de una línea.$
: Coincide con el final de una línea.[ ]
: Coincide con un conjunto de caracteres. Por ejemplo,[aeiou]
coincide con cualquier vocal,[0-9]
coincide con cualquier dígito,[a-z]
con cualquier letra minúscula.-
: Se usa dentro de[ ]
para definir un rango (por ejemplo,[a-z]
coincide con cualquier letra minúscula).
Nota: Algunos comandos requieren regex extendidas (con -E
en grep
o -r
en sed
) para metacaracteres avanzados como +
o |
.
Propósito de grep
grep
(Global Regular Expression Print) se usa para buscar y filtrar líneas que coincidan con un patrón en archivos o en la entrada estándar. Es ideal para analizar logs o encontrar texto específico.
Ejemplo: Buscar líneas con "error" en un archivo de log:
# Crear un archivo de ejemplo
echo -e "Info: Sistema iniciado\nError: Conexión fallida\nInfo: Proceso completado" > log.txt
# Buscar "error" (ignorando mayúsculas/minúsculas)
grep -i "error" log.txt
Salida: Error: Conexión fallida
- Usa
-i
para ignorar mayúsculas/minúsculas -E
para patrones avanzados (por ejemplo,grep -E '[0-9]+'
(que busca uno o más dígitos).-v
invierte la búsqueda, mostrando las líneas que NO coinciden con el patrón.-c
cuenta el número de líneas que coinciden.
Propósito de sed
sed
(Stream Editor) permite transformar texto de forma automatizada, como reemplazar palabras, eliminar líneas o modificar contenido. Es útil para editar flujos de texto sin abrir archivos manualmente.
Ejemplo: Reemplazar "error" por "fallo" en el archivo:
sed 's/error/fallo/gi' log.txt
# La 'g' es importante para reemplazar TODAS las ocurrencias en la línea
Salida: Muestra el archivo con "error" reemplazado por "fallo". Para guardar los cambios:
sed 's/error/fallo/gi' log.txt > log_modificado.txt
cat log_modificado.txt # Para ver el contenido del nuevo archivo
- La sintaxis básica para sustitución es:
s/patrón/reemplazo/modificadores
s
indica una operación de sustitución/
es el delimitador por defecto, pero puedes usar otros si tu patrón o reemplazo contienen/
(por ejemplo,sed 's#patrón#reemplazo#'
).g
(global) reemplaza todas las ocurrencias del patrón en cada línea, no solo la primera.i
(case-insensitive) ignora mayúsculas/minúsculas en el patrón.-i
modifica el archivo original. Si usassed -i.bak 's/...' file
, creará una copia de seguridad file.bak antes de modificar file.
Propósito de awk
awk
es una herramienta para procesar y analizar texto estructurado, como archivos CSV o tablas. Divide el texto en campos según un separador, permitiendo extraer columnas, realizar cálculos o formatear datos.
Ejemplo: Extraer la segunda columna de un archivo CSV:
# Crear un archivo CSV
echo -e "nombre,edad\nAna,25\nJuan,30" > datos.csv
# Extraer la columna de edad
awk -F',' '{print $2}' datos.csv
Salida: edad\n25\n30
-F'DELIMITADOR'
define el **separador de campos**. Si no lo especificas, awk usa espacios o tabulaciones por defecto.- {print $N}: Imprime el campo N
- $0: Representa la línea completa.
- Puedes combinar condiciones con acciones: awk 'CONDICION {ACCION}'
- BEGIN { ... }: Código que se ejecuta antes de procesar la primera línea.
- END { ... }: Código que se ejecuta después de procesar la última línea.
Ejemplos prácticos de búsqueda y manipulación de texto
Los siguientes ejemplos combinan grep
, sed
, y awk
con patrones para tareas comunes.
Ejemplo 1: Filtrar y transformar texto
# Filtrar líneas con números y reemplazar comas por guiones
grep '[0-9]' datos.csv | sed 's/,/-/g'
Salida: nombre-edad\nAna-25\nJuan-30
Ejemplo 2: Procesar datos estructurados con condiciones
# awk -F',' : Usa coma como separador de campos
# '$2 > 25' : Esta es la condición (el segundo campo es mayor que 25)
# '{print $1}' : Si la condición es verdadera, imprime el primer campo
awk -F',' '$2 > 25 {print $1}' datos.csv
Salida: Juan
Ejemplo 3: Combinar comandos
# Buscar líneas con números y extraer el primer campo
grep '[0-9]' datos.csv | awk -F',' '{print $1}'
Salida: nombre\nAna\nJuan
Nota: Usa man grep
, man sed
, o man awk
para más detalles. Combina estos comandos en scripts para automatizar tareas complejas.