Bash regexps para principiantes con ejemplos

Bash regexps para principiantes con ejemplos

El uso de expresiones regulares en bash le proporciona mucha potencia para analizar casi todas las cadenas de texto concebibles (o incluso documentos completos), y transformarlos en casi cualquier salida deseable. Si usa regularmente Bash, o si trabaja regularmente con listas, cadenas textuales o documentos en Linux, encontrará que muchos trabajos pueden simplificarse aprendiendo cómo usar expresiones regulares en Bash. Continúe leyendo para aprender habilidades básicas de expresión regular de Bash! Si ya está familiarizado con las expresiones regulares básicas en Bash u otro lenguaje de codificación, consulte nuestras expresiones regulares de bash más avanzadas. Si no, continúa leyendo para aprender habilidades básicas de expresión regular!

En este tutorial aprenderás:

  • Cómo usar expresiones regulares en la línea de comando en Bash
  • Cómo las expresiones regulares pueden analizar y transformar cualquier cadena de texto y/o documento
  • Ejemplos de uso básico de expresiones regulares en Bash
Bash regexps para principiantes con ejemplos

Requisitos y convenciones de software utilizados

Requisitos de software y convenciones de línea de comandos de Linux
Categoría Requisitos, convenciones o versión de software utilizada
Sistema Independiente de la distribución de Linux
Software Línea de comando bash, sistema basado en Linux
Otro La utilidad SED se utiliza como una herramienta de ejemplo para emplear expresiones regulares
Convenciones # - requiere que los comandos de Linux dados se ejecuten con privilegios raíz directamente como un usuario raíz o mediante el uso de sudo dominio
$-Requiere que los comandos de Linux dados se ejecuten como un usuario regular no privilegiado


Ejemplo 1: nuestra primera expresión regular

Hay varias utilidades de línea de comandos comunes como SED y GREP que aceptan la entrada de expresión regular. Y no tiene que hacer ningún cambio en la herramienta (usar o configurar) para poder usar expresiones regulares tampoco; son por defecto de Regex-Award. Veamos un ejemplo no regex en el que cambiamos a B C en xyz primero:

$ Echo 'ABC' | sed 's/abc/xyz/' xyz 

Aquí hemos usado Echo para emitir la cadena a B C. A continuación, pasamos la salida de este eco (usando la tubería, yo.mi. |, personaje) a la utilidad SED. SED es un editor de transmisión para filtrar y transformar texto. Te animo a que revises su manual detallado escribiendo hombre sed en la línea de comando.

Una vez pasado a SED, estamos transformando la cadena utilizando una sintaxis específica de SED (y consciente de Regex). El comando que pasamos a SED (a saber S/ABC/XYZ/) también se puede leer como Sustituya ABC con WYZ. El s significa sustituto y el carácter del separador (/ en nuestro caso) indica dónde comienza una sección del comando y/u otra. Tenga en cuenta que también podemos usar otros caracteres separadores en SED, como |, Como veremos en ejemplos posteriores.

Ahora, cambiemos este comando en un ejemplo de expresión regular.

$ Echo 'ABC' | Sed 's/./xyz/g 'xyzxyzxyz 


Wow, lo que pasó aquí? 🙂

Hicimos algunos pequeños cambios, que han afectado significativamente la salida resultante. En primer lugar, cambiamos a B C en la línea de comandos SED a .. Este no es un punto regular/literal, sino un punto de expresión regular. Y, en expresión regular, un punto significa cualquier personaje. Las cosas deberían comenzar a verse más claras ahora, especialmente cuando notas el otro pequeño cambio que hicimos: gramo. La forma más fácil de pensar en gramo es como global; una búsqueda y reemplazo repetitivos.

Note aquí también como s es nuestro comando SED real, seguido de las opciones para ese comando (los dos textos de reemplazo desde el gramo es un calificador sobre el comando. Comprender esto bien te ayuda a aprender sintaxis SED al mismo tiempo.

Entonces, en cierto contraste con nuestro ejemplo de expresión no regular, y en el lenguaje natural, este nuevo comando puede leerse como Sustituir cualquier soltero con xyz, y repetidamente ('globalmente') hazlo hasta llegar al final de la cadena. En otras palabras, a se cambia a xyz, b se cambia a xyz etc., dando como resultado la salida triple de XYZ.

Todos a bordo? Excelente! Acabas de aprender a usar expresiones regulares. Vamos a sumergirnos en.

Ejemplo 2: una pequeña advertencia

$ Echo 'ABC' | sed 's | \.| xyz | G 'ABC 

Ups. Qué pasó? Hicimos algunos cambios menores, y la salida cambió sustancialmente, al igual que en nuestro ejemplo anterior. Las expresiones regulares son muy poderosas, como puede comenzar a ver aquí, e incluso un cambio menor puede marcar una gran diferencia en la salida. Por lo tanto, generalmente es necesario probar bien sus expresiones. Y, aunque no es el caso aquí, también es muy importante considerar siempre cómo la salida de las expresiones regulares puede verse afectada por diferentes aportes. A menudo, una entrada ligeramente cambiada o modificada producirá una salida muy diferente (y a menudo errónea).

Cambiamos dos artículos menores; Colocamos un \ antes del punto, y cambiamos los separadores de / a |. El último cambio no hizo absolutamente ninguna diferencia, como podemos ver en esta salida;

$ Echo 'ABC' | sed 's |.| xyz | g 'xyzxyzxyz 


Y podemos verificar nuestros hallazgos hasta ahora usando este comando:

$ Echo 'ABC' | sed 's/\./xyz/g 'ABC 

Como se esperaba, el | a / el cambio no hizo ninguna diferencia.

Entonces, de vuelta a nuestro dilema, ¿diremos que el cambio menor de agregar \ tiene la culpa? Pero, ¿es realmente una falla??

No. Lo que hemos hecho haciendo este simple cambio es hacer el . punto en un literal (\.) punto. En otras palabras, esta ya no es una expresión regular real en el trabajo, sino un simple reemplazo de cadena textual que se puede leer como sustituir cualquier punto literal en xyz, y hazlo repetidamente.

Probemos esto;

$ Echo 'AB ... C' | sed 's/\./xyz/g 'abxyzxyzc 

Esto es como se esperaba: los dos puntos literal se cambiaron individualmente (debido a la naturaleza repetitiva del gramo calificador), para xyz, Generación general abxyzxyzc.

Súper! Ampliámonos un poco más ahora.

Ejemplo 3: tráelo

Nada como bucear en la cabeza primero, claro? Tal vez. Hasta que veas esto;

$ echo 'a ... b ... c' | sed 's | [\.b] \+| d | g; s | [a-c] | d | g 'ddd 

Sí, demasiado complejo, al menos a primera vista. Comencemos con una simplificación de la misma:

$ echo 'a ... b ... c' | sed 's | [\.b] \+| d | g; ' ADC 


Todavía se ve un poco complicado, pero pronto lo entenderás. Entonces, tomando la cadena de entrada de a B C, Podemos ver, según nuestro ejemplo anterior, que estamos buscando un punto literal (\.). Sin embargo, en este caso es seguido por b y rodeado de [ y ]. Esta parte de la expresión regular ([\.b]) se puede leer como cualquier punto literal o el personaje b (Hasta ahora no repetidamente; yo.mi. Una sola carta, cualquiera de ellos, coincidirá con este selector).

A continuación, calificamos esto un poco más al agregar \+ a esto caja de selección. El \+ Indica que estamos buscando al menos uno, y posiblemente más, de estos personajes enumerados (punto literal y B). Tenga en cuenta que los personajes buscaban necesitar estar justo uno al lado del otro, en cualquier orden.

Por ejemplo el texto ... B ... BBBB .. todavía se combinaría como un solo hecho, mientras que ... B ... BBB ... B.B ... BB (Tenga en cuenta que el espacio) sería coincidente como separado (repetitivo) ocurrencias, y ambos (yo.mi. no solo el primero) se combinaría. Y, en ese caso, ambos serían actuados debido a la gramo calificador global/repetitivo.

En otras palabras, en el lenguaje natural podríamos leer esta expresión regular como Sustituya cualquier secuencia contigua de los caracteres . y b con d y hazlo repetidamente.

¿Puedes ver lo que pasa?? En la cadena de entrada tenemos … b… , que coincide con la expresión regular ya que contiene solo \. y b caracteres. Luego se sustituye por d Resultando en ADC.

Nuestro ejemplo más grande ahora se ve más simple de repente. Volvamos a hacerlo:

$ echo 'a ... b ... c' | sed 's | [\.b] \+| d | g; s | [a-c] | d | g 'ddd 

Pensando en cómo se transformó la primera parte del comando SED a B C en ADC, Ahora podemos pensar en esto ADC como la entrada al segundo comando en el SED; s | [a-c] | d | g. Observe cómo ambos comandos SED están separados por ;.

Todo lo que sucede es que la salida del primero se toma como la entrada para el comando posterior. Esto casi siempre funciona, aunque hay momentos (cuando se utilizan modificaciones complejas de texto/documento) donde es mejor pasar la salida de un comando SED real en otro comando SED utilizando una tubería de bash (|).

Analizar el segundo comando (s | [a-c] | d | g) Vemos cómo tenemos otro caja de selección que seleccionarán letras de A a C ([C.A])); el - indica un rango de letras, que es parte de la sintaxis de expresión regular.

Las otras partes de este comando hablan por sí mismas ahora. En total, este segundo comando se puede leer como Sustituya cualquier personaje literal con rango A-C (yo.mi. A, B o C) en d y hazlo repetidamente. El resultado es que A, D y C (salida de ADC desde nuestro primer comando) se representan en ddd.

Ese comando muy complejo ya no se ve tan aterrador, ¿lo hace?? Vamos a redactar.

Ejemplo 4: un mensaje de separación

echo 'que tengas un gran día' | sed 's | $ | Todos |; s | y | y a |; s | $ | you |; s | a [la] \+| a | g; s | $ | Todos | ' 


¿Puedes resolverlo?? Consejo; ps medio fin de la línea En expresiones regulares. Todo el resto de este complejo Regex está utilizando el conocimiento de este artículo. ¿Cuál es la salida?? Vea si puede resolverlo con un pedazo de papel, sin usar la línea de comandos. Si lo hizo, o si no lo hizo 🙂 - Háganos saber en los comentarios a continuación.

Conclusión

En este tutorial, tuvimos una introducción a las expresiones regulares básicas, unidas con algunos ejemplos más avanzados (lengua-in-cheek).

Al aprender expresiones regulares y verificar el código de otras personas, verá expresiones regulares que parecen complejas. Tómese el tiempo para resolverlos y juegue con expresiones regulares en la línea de comandos. Pronto será un experto, y si bien el análisis de reglas complejas suele ser necesaria (la mente simplemente no se presta fácilmente a leer información tan densa), será más fácil. También encontrará que una regex de aspecto complejo, en un análisis posterior, generalmente se ve bastante simple una vez que lo comprende, al igual que en los ejemplos anteriores.

Ahora también le gustaría leer nuestro artículo sobre expresiones regulares en Python, ya que mucha de la información proporcionada allí también se aplica a las expresiones regulares de BASH, aunque algunos de los requisitos de formato son ligeramente diferentes. Aumentará su comprensión de las expresiones regulares, cómo usarlas y cómo aplicarlas en varias situaciones e idiomas de codificación. Una vez que se convierte en un experto en regex, las pequeñas líneas de distinción entre herramientas y lenguajes de programación generalmente se desvanecen, y tenderá a recordar requisitos de sintaxis específicos para cada idioma o herramienta con la que trabaja/con.

Disfrutar!

Tutoriales de Linux relacionados:

  • Bash Regex avanzado con ejemplos
  • Cosas para instalar en Ubuntu 20.04
  • Expresiones regulares de Python con ejemplos
  • Cosas que hacer después de instalar Ubuntu 20.04 fossa focal Linux
  • Una introducción a la automatización, herramientas y técnicas de Linux
  • Manipulación de Big Data para diversión y ganancias Parte 3
  • Manipulación de Big Data para la diversión y las ganancias Parte 1
  • Cosas que hacer después de instalar Ubuntu 22.04 Jellyfish de Jammy ..
  • Cosas para instalar en Ubuntu 22.04
  • Bash Avanzado Variable Idióms para la sensibilidad de los casos ..