Procesamiento de texto y expresiones regulares

LinuxLinuxBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, exploraremos poderosas técnicas de procesamiento de texto en Linux, centrándonos en las expresiones regulares. Utilizaremos varios comandos para buscar, filtrar y manipular texto, brindándote las habilidades esenciales para trabajar con datos de texto en sistemas operativos similares a Unix. Ya seas un principiante o estés buscando mejorar tus habilidades, este laboratorio te proporcionará una base sólida en el procesamiento de texto y las expresiones regulares.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux(("Linux")) -.-> linux/InputandOutputRedirectionGroup(["Input and Output Redirection"]) linux/BasicSystemCommandsGroup -.-> linux/echo("Text Display") linux/BasicFileOperationsGroup -.-> linux/touch("File Creating/Updating") linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") linux/FileandDirectoryManagementGroup -.-> linux/wildcard("Wildcard Character") linux/TextProcessingGroup -.-> linux/grep("Pattern Searching") linux/TextProcessingGroup -.-> linux/sed("Stream Editing") linux/TextProcessingGroup -.-> linux/awk("Text Processing") linux/InputandOutputRedirectionGroup -.-> linux/pipeline("Data Piping") subgraph Lab Skills linux/echo -.-> lab-18003{{"Procesamiento de texto y expresiones regulares"}} linux/touch -.-> lab-18003{{"Procesamiento de texto y expresiones regulares"}} linux/cat -.-> lab-18003{{"Procesamiento de texto y expresiones regulares"}} linux/wildcard -.-> lab-18003{{"Procesamiento de texto y expresiones regulares"}} linux/grep -.-> lab-18003{{"Procesamiento de texto y expresiones regulares"}} linux/sed -.-> lab-18003{{"Procesamiento de texto y expresiones regulares"}} linux/awk -.-> lab-18003{{"Procesamiento de texto y expresiones regulares"}} linux/pipeline -.-> lab-18003{{"Procesamiento de texto y expresiones regulares"}} end

Comprender las Expresiones Regulares con Grep

Las expresiones regulares (regex) son patrones utilizados para coincidir con combinaciones de caracteres en cadenas. Son fundamentales para muchas tareas de procesamiento de texto en Linux. Comenzaremos utilizando grep con expresiones regulares básicas.

Primero, creemos un archivo de texto simple para practicar:

cd ~/project
echo -e "labex\nexlab\nlab*\nLABEX\nLab" > practice.txt

Este comando crea un archivo llamado practice.txt en tu directorio actual con cinco líneas de texto. La opción -e nos permite usar caracteres de escape como \n para saltos de línea.

Ahora, usemos grep con una expresión regular básica:

grep "lab" practice.txt

Deberías ver:

labex
exlab
lab*

Este comando coincide con todas las líneas que contienen "lab". Ten en cuenta que distingue entre mayúsculas y minúsculas, por lo que "LABEX" y "Lab" no se incluyen en la salida.

Intentemos una regex más específica:

grep "^lab" practice.txt

Deberías ver:

labex
lab*

El símbolo ^ coincide con el inicio de una línea, por lo que este comando solo coincide con las líneas que comienzan con "lab".

Ahora, hagamos nuestra búsqueda insensible a mayúsculas y minúsculas:

grep -i "lab" practice.txt

Esto debería coincidir con las cinco líneas del archivo.

Explicación:

  • grep es el comando que estamos usando para buscar patrones.
  • El patrón que estamos buscando está encerrado entre comillas.
  • practice.txt es el archivo en el que estamos buscando.
  • La opción -i hace que la búsqueda sea insensible a mayúsculas y minúsculas.

Uso Avanzado de Grep

Exploremos algunas características más avanzadas de grep que pueden hacer que tu búsqueda de texto sea más poderosa y eficiente.

  1. Mostrar números de línea:

    grep -n "lab" practice.txt

    Esto mostrará los números de línea de las coincidencias. La opción -n le dice a grep que prefije cada línea de salida con el número de línea en el archivo de texto.

  2. Mostrar líneas antes y después de la coincidencia:

    grep -C 1 "exlab" practice.txt

    La opción -C 1 muestra 1 línea de contexto antes y después de la línea que coincide. Puedes ajustar el número para mostrar más o menos líneas de contexto.

  3. Invertir la coincidencia:

    grep -v "lab" practice.txt

    La opción -v invierte la coincidencia, mostrando las líneas que no contienen el patrón. Esto es útil cuando quieres excluir ciertos patrones de tus resultados.

  4. Usar expresiones regulares:

    grep "lab[ex]*" practice.txt

    Esta regex coincide con "lab" seguida de cualquier número de caracteres "e" o "x". Demuestra cómo puedes usar patrones más complejos en tus búsquedas.

Explicación:

  • La opción -n prefija cada línea de salida con su número de línea del archivo.
  • -C 1 muestra una línea de contexto antes y después de la coincidencia, lo que te ayuda a entender el contexto.
  • -v invierte la coincidencia, mostrando las líneas que no coinciden con el patrón.
  • [ex]* es una regex que coincide con cero o más ocurrencias de 'e' o 'x'.

Prueba estos comandos y observa los resultados. Comprender estas opciones mejorará en gran medida tu capacidad para buscar y filtrar texto de manera efectiva.

Introducción a Sed

sed (editor de flujo) es una herramienta poderosa para analizar y transformar texto. A menudo se utiliza para realizar ediciones automatizadas en archivos o flujos de salida. Comencemos con algunas operaciones básicas de sed.

Primero, crea un nuevo archivo para trabajar:

echo -e "Hello, world\nThis is a test\nHello, labex\nWorld of Linux" > sed_test.txt

Esto crea un archivo llamado sed_test.txt en tu directorio actual con cuatro líneas de texto.

Ahora, usemos sed para reemplazar texto:

sed 's/Hello/Hi/' sed_test.txt

Este comando reemplaza la primera ocurrencia de "Hello" con "Hi" en cada línea. Por defecto, sed solo reemplaza la primera coincidencia en cada línea.

Nota: En este ejemplo, dado que "Hello" aparece solo una vez por línea, parece que todas las instancias se reemplazan incluso sin la bandera g.

Para entender mejor el efecto de la bandera g, modifiquemos sed_test.txt para que haya múltiples ocurrencias de "Hello" en la misma línea:

echo -e "Hello, world. Hello everyone\nThis is a test\nHello, labex says Hello\nWorld of Linux" > sed_test.txt

Ahora, el contenido de sed_test.txt es:

Hello, world. Hello everyone
This is a test
Hello, labex says Hello
World of Linux

Ejecuta el comando de reemplazo nuevamente sin la bandera g:

sed 's/Hello/Hi/' sed_test.txt

La salida será:

Hi, world. Hello everyone
This is a test
Hi, labex says Hello
World of Linux

Puedes ver que solo se reemplaza la primera "Hello" en cada línea.

Ahora, realiza un reemplazo global utilizando la bandera g:

sed 's/Hello/Hi/g' sed_test.txt

La salida será:

Hi, world. Hi everyone
This is a test
Hi, labex says Hi
World of Linux

Esta vez, se reemplazan todas las ocurrencias de "Hello" en cada línea con "Hi".

Explicación:

  • sed 's/Hello/Hi/': Reemplaza la primera coincidencia de "Hello" en cada línea.
  • sed 's/Hello/Hi/g': Reemplaza todas las coincidencias de "Hello" en cada línea.
  • La bandera g significa "global", lo que indica que la sustitución se debe realizar para cada ocurrencia en la línea.

Ten en cuenta que estos comandos no modifican el archivo en sí; solo imprimen el texto modificado en la terminal. Para editar el archivo directamente, utiliza la opción -i:

sed -i 's/Hello/Hi/g' sed_test.txt

Ahora, verifica el contenido del archivo para ver los cambios:

cat sed_test.txt

Uso Avanzado de Sed

Ahora que entendemos los conceptos básicos de sed, exploremos algunas características más avanzadas que lo convierten en una herramienta poderosa para la manipulación de texto.

  1. Eliminar líneas:

    sed '2d' sed_test.txt

    Esto elimina la segunda línea del archivo. El comando d en sed significa "eliminar".

  2. Insertar texto:

    sed '1i\First line' sed_test.txt

    Esto inserta "First line" antes de la primera línea del archivo. El comando i significa "insertar".

  3. Añadir texto:

    sed '$a\Last line' sed_test.txt

    Esto añade "Last line" al final del archivo. El comando a significa "añadir", y $ representa la última línea.

  4. Múltiples comandos:

    sed -e 's/Hi/Hello/g' -e 's/labex/LabEx/g' sed_test.txt

    Esto aplica múltiples sustituciones en un solo comando. La opción -e te permite especificar múltiples comandos de sed.

  5. Usar expresiones regulares:

    sed 's/[Ww]orld/Universe/g' sed_test.txt

    Esto utiliza una expresión regular para coincidir tanto con "World" como con "world", reemplazándolos por "Universe".

Explicación:

  • 2d elimina la segunda línea. Puedes cambiar el número para eliminar diferentes líneas.
  • 1i\ inserta texto antes de la primera línea. Cambia el número para insertar en diferentes posiciones.
  • $a\ añade texto al final del archivo.
  • -e te permite especificar múltiples comandos de sed en una sola línea.
  • [Ww] es una expresión regular que coincide con la letra mayúscula "W" o la minúscula "w".

Prueba estos comandos y observa los resultados. Recuerda que, a menos que uses la opción -i, estos cambios no se guardan en el archivo.

Introducción a Awk

awk es una poderosa herramienta de procesamiento de texto que es especialmente buena para manejar datos estructurados. Trata cada línea de entrada como un registro y cada palabra en esa línea como un campo. Comencemos con algunas operaciones básicas de awk.

Primero, crea un nuevo archivo con algunos datos estructurados:

echo -e "Name Age Country\nAlice 25 USA\nBob 30 Canada\nCharlie 35 UK\nDavid 28 Australia" > awk_test.txt

Esto crea un archivo llamado awk_test.txt con una fila de encabezado y cuatro filas de datos.

Ahora, usemos awk para imprimir campos específicos:

awk '{print $1}' awk_test.txt

Esto imprime el primer campo (columna) de cada línea. En awk, $1 se refiere al primer campo, $2 al segundo, y así sucesivamente. $0 se refiere a la línea completa.

Para imprimir múltiples campos:

awk '{print $1, $2}' awk_test.txt

Esto imprime el primer y el segundo campo de cada línea.

También podemos usar condiciones:

awk '$2 > 28 {print $1 " is over 28"}' awk_test.txt

Esto imprime los nombres de las personas mayores de 28 años.

Intentemos algo más complejo:

awk 'NR > 1 {sum += $2} END {print "Average age:", sum/(NR-1)}' awk_test.txt

Esto calcula e imprime la edad promedio, saltando la fila de encabezado.

Explicación:

  • En awk, cada línea se divide automáticamente en campos, generalmente por espacios en blanco.
  • $1, $2, etc., se refieren al primer, segundo, etc., campo en cada línea.
  • NR es una variable integrada que representa el número de registro (línea) actual.
  • El bloque END se ejecuta después de procesar todas las líneas.
  • sum += $2 suma el valor del segundo campo (edad) a un total acumulado.

Prueba estos comandos y observa los resultados. awk es increíblemente poderosa para tareas de procesamiento de datos.

Resumen

En este laboratorio, has aprendido los conceptos básicos de tres poderosas comandos de procesamiento de texto en Linux:

  1. grep: Para buscar patrones de texto utilizando expresiones regulares.
  2. sed: Para la edición de flujo y la transformación de texto.
  3. awk: Para el procesamiento avanzado de texto y la extracción de datos.

En particular, cuando se utiliza sed, profundizamos en el efecto de la bandera g. Sin la bandera g, sed solo reemplaza la primera ocurrencia coincidente en cada línea; con la bandera g, reemplaza todas las ocurrencias coincidentes en cada línea. Al modificar el archivo de ejemplo para incluir múltiples coincidencias en la misma línea, observamos claramente el efecto de la bandera g.

Estas herramientas son esenciales para cualquier usuario de Linux o administrador de sistemas. Te permiten buscar de manera eficiente en archivos, modificar texto y extraer datos específicos de archivos de texto estructurados. A medida que te sientas más cómodo con estos comandos, descubrirás que pueden simplificar en gran medida muchas tareas de procesamiento de texto en tu trabajo diario con sistemas Linux.

Recuerda, la práctica es la clave para dominar estas herramientas. Intenta usarlas en diferentes escenarios y explora sus páginas del manual (man grep, man sed, man awk) para conocer más características y opciones avanzadas. Cada uno de estos comandos tiene muchas más capacidades de las que hemos cubierto aquí, y aprender a usarlos de manera efectiva puede mejorar significativamente tu productividad cuando trabajes con archivos de texto en Linux.