Usar expresiones regulares en AWK

Usar expresiones regulares en AWK

Las expresiones regulares son una herramienta poderosa para el procesamiento de texto en AWK. Le permiten buscar patrones en un archivo de texto y manipular los datos en función de esos patrones. En este artículo, exploraremos cómo usar expresiones regulares en AWK con ejemplos.

Conceptos básicos de expresión regulares

Las expresiones regulares son patrones que coinciden con un conjunto específico de caracteres. La siguiente tabla enumera algunos de los metacharacteres de expresión regulares básicos que puede usar en AWK:

MetacharacterDescripción
.Coincide con cualquier personaje
[]Coincide con cualquier personaje dentro de los soportes
^Coincide con el comienzo de una línea
psCoincide con el final de una línea
*Coincide con cero o más ocurrencias del personaje anterior
+Coincide con uno o más ocurrencias del personaje anterior
?Coincide con cero o una ocurrencia del personaje anterior

AWK proporciona dos funciones incorporadas para usar expresiones regulares: fósforo() y sub(). El fósforo() la función se usa para encontrar la primera aparición de una expresión regular en una cadena, y sub() se usa para reemplazar la primera aparición de una expresión regular en una cadena. Aquí hay unos ejemplos:

Ejemplo 1: coincidir con una expresión regular

Digamos que tenemos un archivo que contiene una lista de direcciones de correo electrónico, y queremos encontrar todas las direcciones de correo electrónico que terminan con ".com ". Podemos usar el fósforo() Funcionar para lograr esta tarea de la siguiente manera:

Awk 'if (Match ($ 0, /\.com $/)) imprimir $ 0 'Correo electrónico.TXT
12345Awk 'if (Match ($ 0, /\.com $/)) imprimir $ 0 'Correo electrónico.TXT

Aquí, usamos el fósforo() función para buscar la expresión regular /.com $/ (que coincide con cualquier cadena que termine con ".com ”) en cada línea del archivo. Si se encuentra una coincidencia, imprimimos la línea.

Ejemplo 2: reemplazar una expresión regular

Digamos que tenemos un archivo que contiene una lista de números de teléfono, y queremos reemplazar todas las instancias de "555" con "666". Podemos usar el sub() Funcionar para lograr esta tarea de la siguiente manera:

AWK 'sub (/555/, "666", $ 0) Imprimir $ 0' Teléfono.TXT
1234AWK 'sub (/555/, "666", $ 0) Imprimir $ 0' Teléfono.TXT

Aquí, usamos el sub() función para buscar la expresión regular /555/ (que coincide con cualquier cadena que contenga "555") en cada línea del archivo, y reemplácela con "666". Luego imprimimos la línea modificada.

Técnicas avanzadas de expresión regular

Además de la expresión regular básica de Metacharacters, AWK admite varias técnicas avanzadas de expresión regular que pueden ayudarlo a lograr tareas de procesamiento de texto más complejas. Éstas incluyen:

1. Agrupamiento:

Puede agrupar partes de una expresión regular juntas usando paréntesis. Esto le permite aplicar un cuantificador al grupo en su conjunto, o extraer partes específicas de la cadena emparejada.

Digamos que tenemos un archivo que contiene una lista de nombres y salarios de los empleados, y queremos extraer los nombres y salarios por separado. Podemos usar la agrupación para lograr esta tarea de la siguiente manera:

Awk 'if (match ($ 0, /^(\ w+) \ s+(\ d+) $ /)) name = subStr ($ 0, rstart, rlength) salary = subStr ($ 0, rstart+longitud (nombre) +1 , longitud ($ 0) -rstart-longitud (nombre)) Nombre de impresión Salario de impresión 'Empleados.TXT
12345678Awk 'if (match ($ 0, /^(\ w+) \ s+(\ d+) $ /)) name = subStr ($ 0, rstart, rlength) salary = subStr ($ 0, rstart+longitud (nombre) +1 , longitud ($ 0) -rstart-longitud (nombre)) Nombre de impresión Salario de impresión 'Empleados.TXT

Aquí, usamos la agrupación para que coincida con la expresión regular /^(\ w+) \ s+(\ d+) $ / (que coincide con una línea que contiene uno o más caracteres de palabras seguidos de uno o más caracteres de espacios blancos, seguidos de uno o más dígitos) y extrae el nombre y el salario por separado.

2. Backreferencias:

Puedes usar backreferencias (yo.mi., \ 1, \ 2, etc.) para referirse a partes de la expresión regular que coincidían con un grupo. Esto le permite reutilizar susters coincidentes en la cadena de reemplazo.

Digamos que tenemos un archivo que contiene una lista de números de teléfono en el formato (xxx) xxx-xxxx, y queremos cambiar el formato a xxx-xxx-xxxx. Podemos usar backreferencias para lograr esta tarea de la siguiente manera:

Awk 'sub (/\ ((\ d 3) \) (\ d 3)-(\ d 4)/, "\ 1- \ 2- \ 3", $ 0) Imprima $ 0 ' teléfono.TXT
1234Awk 'sub (/\ ((\ d 3) \) (\ d 3)-(\ d 4)/, "\ 1- \ 2- \ 3", $ 0) Imprima $ 0 ' teléfono.TXT

Aquí usamos backreferencias (yo.mi., \ 1, \ 2 y \ 3) para referirse a los tres grupos de dígitos coincidentes por la expresión regular "/(\ D3) (\ d3) (\ d 3)-(\ d 4)/" (que coincide con un número de teléfono en el formato (xxx) xxx-xxxx) y reemplace el formato con xxx-xxx-xxxx.

3. Lookahead y se vean:

Puedes usar lookhead (?=) y parecer (?<=) para que coincidan los patrones si son seguidos o precedidos por otro patrón, respectivamente.

Digamos que tenemos un archivo que contiene una lista de URL, y queremos extraer solo los nombres de dominio (i.mi., el texto entre "Http: //" y el siguiente "/" personaje). Podemos usar LookAhead y mirar para lograr esta tarea de la siguiente manera:

Awk 'if (Match ($ 0, /(?<=http:\/\/)[^\/]+/)) print substr($0, RSTART, RLENGTH) ' urls.txt
12345Awk 'if (Match ($ 0, /(?<=http:\/\/)[^\/]+/)) print substr($0, RSTART, RLENGTH) ' urls.txt

Aquí usamos LookAhead (?<=) para que coincida con la expresión regular "/(?<=http://)[^/]+/" (que coincide con cualquier personaje que viene después "Http: //" Y antes del siguiente "/" personaje) y extraer el nombre de dominio.

4. Clases de caracteres negadas:

Digamos que tenemos un archivo que contiene una lista de direcciones de correo electrónico, y queremos extraer solo las direcciones que pertenecen a un dominio específico (E.gramo., ejemplo.com). Podemos usar clases de caracteres negadas para lograr esta tarea de la siguiente manera:

Awk 'if (Match ($ 0, /^[^@]+@Ejemplo \.com $/)) imprimir $ 0 'correos electrónicos.TXT
12345Awk 'if (Match ($ 0, /^[^@]+@Ejemplo \.com $/)) imprimir $ 0 'correos electrónicos.TXT

Aquí, usamos una clase de carácter negada ([^@]+) para que coincidan con cualquier personaje que no sea "@" y extrae el nombre de usuario y luego coincida con la cadena literal "@ejemplo.com " para garantizar que la dirección pertenezca al dominio especificado.

5. Alternancia:

Digamos que tenemos un archivo que contiene una lista de números de teléfono, y queremos extraer solo los números que están en formato "(xxx) xxx-xxxx" o "xxx-xxx-xxxx". Podemos usar una alternancia para realizar esta tarea de la siguiente manera:

Awk 'if (match ($ 0, /\ ((\ d 3) \) (\ d 3)-(\ d 4) | (\ d 3)-(\ d 3 )-(\ d 4)/)) imprima sustr ($ 0, rstart, rLength) 'teléfonos.TXT
12345Awk 'if (match ($ 0, /\ ((\ d 3) \) (\ d 3)-(\ d 4) | (\ d 3)-(\ d 3 )-(\ d 4)/)) imprima sustr ($ 0, rstart, rLength) 'teléfonos.TXT

Aquí usamos alternancia (|) para que coincida o la expresión regular "/(\ D3) (\ d3) (\ d 3)-(\ d 4)/" (que coincide con un número de teléfono en el formato (xxx) xxx-xxxx) o la expresión regular "/((\ D 3)-(\ d 3)-(\ d 4)/" (que coincide con un número de teléfono en el formato xxx-xxx-xxxx).

Conclusión

Las expresiones regulares son una herramienta poderosa para el procesamiento de texto en AWK. Le permiten buscar patrones en un archivo de texto y manipular los datos en función de esos patrones. Al dominar las expresiones regulares en AWK, puede ser más efectivo y eficiente en sus tareas de procesamiento de texto y lograr la manipulación de datos complejas con facilidad.