Aumenta tu productividad en la terminal de Linux aprendiendo esta sintaxis de búsqueda avanzada 1

Aumenta tu productividad en la terminal de Linux aprendiendo esta sintaxis de búsqueda avanzada

Índice
  1. ¿Qué es Regex?
  2. Los Diferentes Sabores de Regex
  3. Una Visión General Rápida de Regex para Disipar Cualquier Misterio
  4. El Metacaracter DOTALL: Coincide con Cualquier Cosa y Todo
  5. Clases de Caracteres: Coincide con Caracteres Específicos en Cualquier Orden
  6. Grupos de Coincidencia: Dibuja Límites Alrededor de Subexpresiones
  7. Quantificadores: Cómo Especificar Cantidades Exactas y Variables
    1. Coincidir Cero o Más Cosas Con el Asterisco
    2. Coincidir Uno o Más Cosas Con el Signo Plus
    3. Hacer Cosas Opcionales Con el Signo de Interrogación
    4. Definir Cantidades Exactas Con Corchetes Curly
    5. Un Resumen de Cuantificadores
  8. Coincidir Tanto o Tan Poco Como Quieras Con Cuantificadores Lentos y Greedy
  9. Anclas Coinciden Con el Inicio y el Final de las Líneas
  10. Modificadores: Banderas Que Cambian Cómo Funciona Regex
    1. El Modificador Global
    2. El Modificador de Insensibilidad a Mayúsculas
    3. El Modificador Multilínea
  11. Poniendo Todo Junto: Usando Regex Con Comandos
    1. Usando grep Con Regex
    2. Usando find Con Regex
    3. Usando fd Con Regex
    4. Usando ripgrep Con Regex
    5. Usando sed Con Regex

Descubre cómo utilizar Regex para optimizar la búsqueda de archivos en tu sistema de Linux, mejorando tu precisión y eficiencia con patrones de coincidencia flexibles.

Buscar en tu sistema de archivos puede ser complicado. Por ejemplo, ¿a veces te resulta difícil ser específico o exacto? ¿O quizás hay demasiado ruido? Regex puede resolver estos problemas y más. Es poderoso, universal y flexible, y los conceptos básicos te llevarán muy lejos.

¿Qué es Regex?

Regex es un lenguaje de coincidencia de patrones; es una forma de describir de manera expresiva patrones que coinciden con cadenas (por ejemplo, palabras o frases). Por ejemplo, digamos que estás buscando en tu disco duro una imagen llamada foo, pero no puedes recordar si es un JPEG o un PNG. Podemos usar regex con fd de esta manera: fd 'foo\.(jpg|png)'.

Muchas utilidades hacen uso de regex para buscar, transformar e interactuar con texto. Por ejemplo, grep -E [regex], find -regex [regex], o fd [regex]. Usar regex significa que puedes ser muy preciso.

Regex se utiliza en todas partes. La mayoría de los sitios web en Internet lo utilizan de una forma u otra. Regex también es común en utilidades y aplicaciones, como ripgrep, Vim, Neovim, Emacs y muchas más.

Los Diferentes Sabores de Regex

Regex viene en diferentes sabores, lo que significa, esencialmente, diferentes reglas (también conocidas como sintaxis). Hay muchos sabores, pero sólo difieren en pequeños detalles. Si te ciñes a los conceptos que cubriré más adelante, funcionarán en la mayoría de los sabores y utilidades de Linux. No necesitas pensar demasiado en ello.

PCRE (Expresiones Regulares Compatibles con Perl) es el sabor más completo. Todos los ejemplos intentan ser compatibles con PCRE.

Cuando te conviertas en un profesional, puedes consultar el artículo de Wikipedia que compara sabores de regex o una tabla de comparación de regex exhaustiva. Ten en cuenta que los conceptos que aprenderás deberían aplicarse en cualquier parte.

Una Visión General Rápida de Regex para Disipar Cualquier Misterio

La siguiente lista te introducirá suavemente a características comunes de regex:

ConceptoDescripción
Clases de caracteresUna lista de caracteres específicos que deseas coincidir, por ejemplo, [abc].
Grupos de coincidenciaCorchetes alrededor de partes relacionadas de la expresión, como corchetes en matemáticas, por ejemplo, (foo).
ModificadoresCambian cómo funciona la expresión, por ejemplo, sensibilidad a mayúsculas.
AnclasDefinen el inicio y el final de una cadena, por ejemplo, ^foo$.
CuantificadoresIndican cantidad, por ejemplo, foo+, foo{3}, etc.
AlternanciaSimplemente una declaración de o, por ejemplo, foo|bar.
Metacaracter DOTALLCoincide con cualquier cosa, como un comodín: es simplemente un punto.

Usarás estas características para describir un patrón.

Estas características sólo se aplican en general si las utilizas con las banderas de comando mencionadas más adelante. Por ejemplo, grep -P foo.

El Metacaracter DOTALL: Coincide con Cualquier Cosa y Todo

El metacaracter DOTALL es como un comodín porque coincide con todo. Es simplemente un punto. Lo usarás a menudo en lugares donde debería coincidir cualquier cosa.

Clases de Caracteres: Coincide con Caracteres Específicos en Cualquier Orden

Las clases de caracteres son una lista de caracteres, encerrados en corchetes, que deseas coincidir. Por ejemplo, la siguiente expresión coincide con a, b, z, 1, 2 o 9:

[abz129]

Esto coincide con cualquier carácter alfanumérico, en mayúsculas o minúsculas:

[a-zA-Z0-9]

El guión (-) tiene un significado especial en una clase de caracteres, así que, si deseas coincidir con él literalmente, debes colocarlo primero [-a-z] o escaparlo [a-z\-].

De nuevo, es importante entender que una clase de caracteres coincide exactamente con un carácter, a menos que uses un cuantificador (cubierto más adelante).

Si miras de cerca la caja de resultados en la imagen, verás que una única clase de caracteres coincide con múltiples caracteres. El modo global (g) es responsable de esto. El modo global significa que regex no se detiene en la primera coincidencia, sino que sigue adelante y crea múltiples coincidencias.

Grupos de Coincidencia: Dibuja Límites Alrededor de Subexpresiones

De alguna manera, coincide.

Los grupos son similares a los corchetes en matemáticas. Por ejemplo, cuando escribes una expresión matemática como 1 + (2 / 2), es diferente de (1 + 2) / 2. El cálculo comienza con los corchetes más internos, lo que altera el resultado.

Los corchetes en regex funcionan como límites; agrupan partes de la expresión. Por ejemplo, foo(bar|baz) no es lo mismo que foobar|baz, porque el primero coincidirá con foobar o foobaz; el segundo coincidirá con foobar o baz.

Quantificadores: Cómo Especificar Cantidades Exactas y Variables

Los cuantificadores nos permiten definir cantidades. Cuando coincidimos con un carácter utilizando DOTALL o clases de caracteres, usamos cuantificadores para indicar cuántos. También podemos aplicar cuantificadores para coincidir grupos, así podemos definir cantidades para expresiones enteras.

Coincidir Cero o Más Cosas Con el Asterisco

El metacarácter asterisco (*) coincide con cero o más cosas. Lo siguiente coincide con a, b, z, o una cadena vacía:

[abz]*

Coincidir Uno o Más Cosas Con el Signo Plus

El metacarácter más (+) coincide con uno o más cosas. Lo siguiente coincide con uno o más caracteres a, b, o z:

[abz]+

Hacer Cosas Opcionales Con el Signo de Interrogación

El metacarácter signo de interrogación (?) hace que el ítem anterior sea opcional. Lo siguiente coincidirá exactamente con una a, b, z, o nada en absoluto:

[abz]?

Definir Cantidades Exactas Con Corchetes Curly

Los corchetes rizados nos permiten definir un número exacto. Por ejemplo, lo siguiente coincidirá con a, b, o z exactamente dos veces:

[abz]{2}

Lo siguiente coincidirá con a, b, o z entre 2 y 4 veces:

[abz]{2,4}

Un Resumen de Cuantificadores

  • ?: Opcional.
  • *: Cero o más (cero significa una cadena vacía).
  • +: Uno o más.
  • {n,m}: Coincidir entre n y m ítems.

Los metacaracteres más (+) y de interrogación (?) no funcionan con la mayoría de las utilidades de Linux a menos que uses las banderas de comando apropiadas. Las banderas se tratarán más adelante.

Coincidir Tanto o Tan Poco Como Quieras Con Cuantificadores Lentos y Greedy

Algunos cuantificadores nos permiten definir una cantidad no especificada. Por ejemplo, el signo más (+) significa uno o más—cualquier cosa mayor que 0. Los metacaracteres más (+) y asterisco (*) son greedy por defecto, lo que significa que intentan coincidir con tanto como sea posible. En contraste, podemos hacerlos lentos para que coincidan con lo menos posible.

Agregar un signo de interrogación (?) los hace lentos. Por ejemplo, lo siguiente coincidirá con a, b, o z, pero se detendrá después de la primera coincidencia (es lento).

[abz]+?

El metacarácter asterisco (*) es similar excepto por un pequeño detalle: coincide con cero o más ítems. La coincidencia más lenta posible es cero, así que lo siguiente no coincidirá con nada.

[abz]*?

Hacer que un cuantificador sea lento puede ser más eficiente porque no necesita procesar toda la cadena. Si estás buscando millones de cadenas, coincidir solo con los primeros caracteres puede ahorrar mucho tiempo y recursos.

Anclas Coinciden Con el Inicio y el Final de las Líneas

Las anclas son simples de entender. Hay dos, una que indica el inicio de una línea (^) y una que indica el final ($). El siguiente patrón coincide exactamente con foo y nada más:

^foo$

Modificadores: Banderas Que Cambian Cómo Funciona Regex

Los modificadores son una forma de cambiar cómo funciona regex. Por ejemplo, podemos hacerlo sensible a mayúsculas. Ya hemos visto el modificador global, pero vale la pena reiterar que son banderas que típicamente viven al final de una expresión.

El Modificador Global

El modificador global (g) permite que regex continúe buscando coincidencias después de encontrar la primera, resultando en múltiples coincidencias. En contraste, desactivar el modificador global hace que regex se detenga después de encontrar la primera coincidencia.

El Modificador de Insensibilidad a Mayúsculas

El modificador de insensibilidad a mayúsculas (i) coincidira tanto con mayúsculas como con minúsculas cuando esté activo.

El Modificador Multilínea

Las anclas definen el inicio (^) y el final ($) de una cadena. Cuando el modificador multilínea (m) está activo, las anclas coinciden con el inicio y el final de cada línea. Cuando está inactivo, las anclas coinciden con toda la cadena.

Así es como se comportan las anclas cuando el modo multilínea está activo:

^foo$
^bar$

Y cuando no lo está.

inactivo:

^foo
bars$

Para evaluar todas las líneas cuando el modificador de múltiples líneas (m) está activo, también debes habilitar el modificador global (g). Pero recuerda que hacerlo también creará múltiples coincidencias.

Poniendo Todo Junto: Usando Regex Con Comandos

Entonces ahora para el gran final: ¿cómo aprovechamos lo que hemos aprendido? Como se mencionó al principio, find, fd, grep, ripgrep y sed admiten regex. Presta atención a las banderas de comando que utilizo; las elegí para que usen sabores similares.

Para cada comando, usaré la siguiente expresión:

^.+/[fo]+\.(jpg|png)$

Este patrón coincide con una ruta POSIX para un archivo JPG o PNG. Por ejemplo:

/foo/bar/baz/foo.jpg

Esta expresión cubre todo lo que hemos aprendido: anclas, clases de caracteres, cuantificadores, alteración, grupos de coincidencia y el metacaracter DOTALL. Aquí tienes un resumen de la expresión (en orden de aparición):

SegmentoNota
^Coincidir con el inicio de la línea.
.+Coincidir con cualquier carácter, una o más veces.
/Coincidir con una barra diagonal justo antes del nombre del archivo. Esta barra literal define un límite claro para nuestro nombre de archivo, y el anterior DOTALL coincidirá con todos los demás caracteres de la ruta (incluidas las barras).
[fo]+Coincidir con las letras f y o una o más veces, por ejemplo, fo, foo, ffoo, fffooo, fofofof.
\.Coincidir con un punto literal (no un DOTALL).
(jpg|png)Un grupo de coincidencia; lo he usado aquí para agrupar estos dos patrones. La barra vertical se llama alteración, y usarla así significa jpg o png.
$Coincidir con el final de la línea.

Coincidiré todas las expresiones contra un archivo (llamado ejemplos) con el siguiente contenido:

/foo/bar/baz/foo.jpg
/one/two/thr/foo.png

/this/should/not/match.jpg

Para los comandos find, crearé tales archivos en mi sistema de archivos y los buscaré.

Usando grep Con Regex

Para grep, debemos usar la bandera -P, que habilita su motor PCRE (limitado). PCRE es el sabor más extensivo y admite casi todas las características que puedas imaginar.

Si no estás familiarizado con grep, consulta esta detallada guía sobre cómo usarlo.

Usando find Con Regex

El comando find admite múltiples sabores de regex. Puedes ver una lista de ellos con el siguiente comando:

find -regextype help

El sabor que más se asemeja a PCRE es posix-extended, también conocido como POSIX ERE (Expresiones Regulares Extendidas). POSIX ERE carece de muchas características avanzadas, pero admite todas las funciones que hemos cubierto.

Si este comando parece largo, probablemente debas usar un alias para establecer las opciones de regex por defecto.

Usando fd Con Regex

El comando fd utiliza la biblioteca regex de Rust (un paquete de Rust). La biblioteca regex es casi compatible con PCRE, por lo que podemos usarla sin mucha preocupación. Sin embargo, por defecto, fd solo coincide con los nombres de archivo, por lo que debemos usar la bandera --full-path si queremos coincidir con toda la ruta del archivo.

Usando ripgrep Con Regex

Usar regex con el comando ripgrep es sencillo porque utiliza la biblioteca regex de Rust. Como se mencionó anteriormente, la biblioteca de Rust coincide estrechamente con PCRE.

Usando sed Con Regex

El comando sed es diferente de los otros; nos permite buscar y reemplazar cadenas. Si no estás familiarizado con él, deberías consultar esta excelente guía sobre cómo usar el comando sed. La forma general del comando es la siguiente:

s/patrón/reemplazo/

No es necesario usar barras diagonales, porque puedes usar cualquier carácter que desees. En el ejemplo a continuación, he usado el carácter pipe en lugar de barras diagonales para que no confunda a sed. Usar un pipe significa que no necesito escapar las barras diagonales en el valor de reemplazo proporcionado (una ruta).

Para sed, necesitamos usar el sabor de regex GNU ERE, y lo hacemos con la bandera -E. Todo lo que funciona en GNU ERE funcionará en PCRE, lo cual es bueno para nosotros.

En el ejemplo, extraje los resultados y reemplacé los.

Las rutas de archivo, similar a cómo funcionan cat y grep, pero sed también admite la edición en el lugar a través de la bandera -i.

Así que eso es todo; esos son los conceptos básicos de regex. Los fundamentos te llevarán muy lejos. Lo importante a recordar es que muchas utilidades utilizan diferentes sabores de regex, y así, si te desvias de las banderas mencionadas, puedes encontrarte con que algunas características no funcionan.

Además de eso, regex es algo que necesitas practicar antes de que realmente tenga sentido. Puedes practicar tus habilidades, obtener información y aprender más a través de regex101, un poderoso espacio de juegos en línea que proporciona consejos y orientación.

Si deseas encontrar artículos similares a Aumenta tu productividad en la terminal de Linux aprendiendo esta sintaxis de búsqueda avanzada, te sugerimos revisar la categoría Linux.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir