Cómo verificar si una cadena contiene una subcadena en Bash

How Check If String Contains Substring Bash



La pregunta es cómo verificar si una cadena contiene una subcadena en Bash. La respuesta es: use Pattern Matching. Esto da lugar a otra pregunta, que es: ¿qué es la coincidencia de patrones? Bueno, una frase en una oración tiene ciertas características. Por eso se diferencia de otras frases en la misma frase o en otras frases. Las características se pueden codificar como un patrón. De esa manera, se puede identificar una frase particular en una cadena. Este artículo explica cómo identificar una subcadena en particular en una cadena más grande, reemplazar la subcadena que coincide con otra subcadena y ubicar cualquier subcadena en una cadena más grande por índice. Sin embargo, antes de sumergirse en las explicaciones, hay que recordar las diferentes formas en que se establece una cadena en Bash.

Cadena por espacios de escape

Se puede construir una cadena reemplazando cada espacio con la secuencia de escape del espacio, ''; como en:







myVar= Turismo en Egipto es uno del país's industrias económicas líderes.
echo $ myVar

La salida es:



El turismo en Egipto es una de las principales industrias económicas del país.



Nota: el apóstrofo también usó la secuencia de escape espacial.





Cadena por comillas individuales

¿El programador tiene tiempo para escapar de todos los espacios en una cadena? No. Por lo tanto, es mejor usar dos comillas simples para delimitar una cadena; tal como:

myVar='El turismo en Egipto es uno de los países'''las principales industrias económicas'.

Una cadena entre comillas simples no permite la expansión (reemplazando con su efecto) de ninguna secuencia de escape. Afortunadamente, si se codifican dos cadenas una al lado de la otra, se tomarán como una sola cadena. Se puede insertar una secuencia de escape en el medio, como se hizo anteriormente. La secuencia de escape se ampliaría. Entonces la salida se convierte en:



El turismo en Egipto es una de las principales industrias económicas del país.

Cadena por comillas dobles

Con las comillas dobles, las secuencias de escape no se expanden también, pero las variables se expanden. El siguiente código ilustra esto:

myVar= Turismo en Egipto es uno del país's industrias económicas líderes.
echo $ myVar

La salida es:

El turismo en Egipto es una de las principales industrias económicas del país.

Nota: el apóstrofo también usó la secuencia de escape espacial.

En este artículo, el tipo principal de cadena que se considera es la cadena entre comillas simples.

Fundamentos de expresiones regulares

Regex

Considere esta cadena:

Este mundo no es realmente nuestro hogar.

Sea mundo la subcadena de interés. Entonces, la cadena grande (cadena completa) se llama cadena de destino o simplemente, destino. El 'mundo' entre comillas se llama expresión regular o simplemente, regex. El contenido, el mundo, es el patrón, en este caso.

Coincidencia simple

En el siguiente código, si la palabra 'mundo' se encuentra en el destino, diríamos que la palabra ha sido coincidente.

pag='Este mundo no es realmente nuestro hogar'.
reg='mundo'
si [[ $ str=~$ reg ]];luego
echofundar
demás
echoextraviado
ser

= ~, que es el operador de asignación seguido de ~, se llama operador de enlace. La condición comprueba si el patrón coincide en la cadena de destino. Si se encuentra una subcadena correspondiente al patrón en el destino, se muestra la declaración de eco encontrado. Si no se encuentra, la instrucción echo se hace eco de no encontrado. El resultado de este código es:

fundar

Como el patrón, el mundo, se encuentra en el objetivo. Tenga en cuenta que se ha mantenido el espacio delimitador después de [[y antes]].

Patrón

En el código anterior, 'mundo' entre comillas es la expresión regular, mientras que el mundo en sí es el patrón. Este es un patrón sencillo. Sin embargo, la mayoría de los patrones no son tan simples. Un patrón es una caracterización de una subcadena que se encuentra. Y así, el patrón Bash usa ciertos metacaracteres. Un metacarácter es un personaje sobre otros personajes. Por ejemplo, Bash Pattern utiliza los siguientes metacaracteres:

^ $ . * + ? ( ) [ ] { } |

Una expresión regular también se puede escribir en la condición corchetes dobles. Pero no tiene por qué estar entre comillas. Entonces, en este caso, es literalmente un patrón.

Clases de personajes

Corchetes

Se encuentra la salida del siguiente código, lo que significa que se produjo una coincidencia:

pag=El gato entró en la cámara.
si [[ $ str=~[cbr]a]];luego
echofundar
ser

El patrón [cbr] at coincide con cat, que comienza con 'c' y continúa y termina con at. [cbr] en significa, coincide con 'c' o 'b' o 'r' seguido de en.

Se encuentra la salida del siguiente código, lo que significa que se produjo una coincidencia:

pag=El murciélago entró en la recámara.
si [[ $ str=~[cbr]a]];luego
echofundar
ser

El patrón [cbr] at coincide con bat, que comienza con 'b', y continúa y termina con at. [cbr] en significa, coincide con 'c' o 'b' o 'r' seguido de en.

Se encuentra la salida del siguiente código, lo que significa que se produjo una coincidencia:

pag=La rata entró en la cámara.
si [[ $ str=~[cbr]a]];luego
echofundar
ser

El patrón [cbr] at coincide con la rata, que comienza con 'r' y continúa y termina con at.

En los ejemplos de código anteriores, el programador no sabe si existe gato, murciélago o rata en la cadena de destino. Pero sabe que la subcadena comienza con 'c', 'b' o 'r', luego continúa y termina con at. Los corchetes en un patrón permiten que diferentes caracteres posibles coincidan con un carácter en una posición relativa a otros en el destino. Entonces, los corchetes contienen un conjunto de caracteres, uno de los cuales coincide con una subcadena. Finalmente, es la subcadena completa la que coincide.

Rango de caracteres

En el código anterior [cbr] es una clase. Incluso si 'c', 'b' o 'r' corresponde a un solo carácter, si lo que sigue inmediatamente no coincide, el patrón no coincidirá con nada.

Bueno, hay ciertos rangos que formarán una clase. Por ejemplo, de 0 a 9 dígitos forman la clase, [0-9] con 0 y 9 incluidos. La 'a' minúscula a la 'z' forma la clase [a-z] con 'a' y 'z' incluidas. Las mayúsculas de la 'A' a la 'Z' forman la clase [A-Z] con 'A' y 'Z' incluidas. De una clase, es uno de los caracteres que coincidiría con un carácter de la cadena.

El siguiente código produce una coincidencia:

si [[ 'ID8id'=~[0-9] ]];luego
echofundar
ser

Esta vez, el objetivo es una cadena literal en la condición. 8, que es uno de los números posibles dentro del rango, [0-9], coincide con 8 en la cadena, 'ID8id'. El código anterior es equivalente a:

si [[ 'ID8id'=~[0123456789] ]];luego
echofundar
ser

Aquí, todos los números posibles se han escrito en el patrón, por lo que no hay guión.

En el siguiente código, se obtiene una coincidencia:

si [[ 'ID8iD'=~[Arizona] ]];luego
echofundar
ser

La coincidencia es entre la 'i' minúscula del rango, [a-z], y la 'i' minúscula de la cadena de destino, 'ID8iD'.

Recuerde: el rango es una clase. La clase puede formar parte de un patrón más amplio. Entonces, en un patrón, el texto puede estar al frente y / o después de la clase. El siguiente código ilustra esto:

si [[ 'ID8id es el identificador'= ~ ID[0-9]identificación ]];luego
echofundar
ser

El resultado es: encontrado. 'ID8id' del patrón coincide con 'ID8id' en la cadena de destino.

Negación

La coincidencia no se obtiene del siguiente código:

si [[ '0123456789101112'=~[^0-9] ]];luego
echofundar
demás
echoextraviado
ser

La salida es:

extraviado

Sin ^ delante del rango, dentro de los corchetes, el cero del rango habría coincidido con el primer cero de la cadena de destino. Entonces, ^ delante de un rango (o caracteres opcionales) niega la clase.

El siguiente código produce una coincidencia porque la condición dice: coincide con cualquier carácter que no sea un dígito en cualquier lugar del destino:

si [[ 'ABCDEFGHIJ'=~[^0-9] ]];luego
echofundar
demás
echoextraviado
ser

Entonces la salida es: encontrada.

[^ 0-9] significa un no dígito, por lo que [^ 0-9] es la negación de [0-9].

[^ a-z] significa una letra no minúscula, por lo que [^ a-z] es la negación de [a-z].

[^ A-Z] significa una letra no mayúscula, por lo que [^ A-Z] es la negación de [A-Z].

Hay otras negaciones disponibles.

El punto (.) En el patrón

El punto (.) Del patrón coincide con cualquier carácter, incluido él mismo. Considere el siguiente código:

si [[ '6759WXY.A3'=~ 7.9W.Y.A]];luego
echofundar
ser

La salida del código se encuentra porque los otros caracteres coinciden. Un punto coincide con '5'; otro punto coincide con 'X'; y el último punto coincide con un punto.

Alternancia coincidente

Considere esta oración para una cadena de destino:

La jaula tiene pájaros de diferentes tipos.

Alguien puede querer saber si este objetivo tiene paloma, pavo real o águila. Se puede utilizar el siguiente código:

pag='La jaula tiene pavos reales de diferentes tipos'.
si [[ $ str= ~ paloma|pavo real|Águila]];luego
echofundar
demás
echoextraviado
ser

El resultado es, encontrado. El metacarácter de la alternancia, | ha sido empleado. Puede haber dos, tres, cuatro y más alternativas. Lo que ha coincidido en este código es 'pavo real'.

Agrupamiento

En el siguiente patrón, se han utilizado paréntesis para agrupar caracteres:

un escenario (bailarina)

El grupo aquí es un bailarín de escenario rodeado por los metacaracteres (y). (bailarín) es un subgrupo, mientras que un escenario (bailarín) es todo el grupo. Considera lo siguiente:

La (bailarina es increíble)

Aquí, el subgrupo o subcadena es, bailarina es increíble.

Subcadenas con partes comunes

Un interesado es una persona interesada en un negocio. Imagine una empresa con un sitio web, Stake.com. Imagine que una de las siguientes cadenas de destino está en la computadora:

El sitio web, stake.com es para el negocio .;

Ahí está la parte interesada .;

El interesado trabaja para Stake.com .;

Deje que cualquiera de estas cadenas sea el objetivo. El programador puede querer saber si Stake.com o la parte interesada está en la cadena de destino. Su patrón sería:

Stake.com | accionista

usando alternancia.

La apuesta se ha escrito dos veces en las dos palabras. Esto se puede evitar escribiendo el patrón de la siguiente manera:

participación (.com | titular)

.com | holder es el subgrupo en este caso.

Nota: el uso del carácter de alternancia en este caso. Stake.com o las partes interesadas se seguirán buscando. Se encuentra la salida del siguiente código:

pag='El sitio web, Stake.com es para el negocio'.
si [[ $ str= ~ participación(.con|poseedor) ]];luego
echofundar
ser

La subcadena que coincide aquí es Stake.com.

La matriz predefinida BASH_REMATCH

BASH_REMATCH es una matriz predefinida. Suponga que un patrón tiene grupos. Todo el grupo emparejado entra en la celda del índice 0 de esta matriz. El primer subgrupo emparejado entra en la celda del índice 1; el segundo subgrupo coincide, entra en la celda del índice 2, y así sucesivamente. El siguiente código muestra cómo usar esta matriz:

pag=Ha llegado la bailarina de teatro.
si [[ $ str= ~ etapa (bailarín) ]];luego
echofundar
ser

porIen $ {! BASH_REMATCH [@]};hacer
printf '$ {BASH_REMATCH [i]}, '
hecho
echo

La salida es:

fundar
bailarina de escenario, bailarina,

Todo el grupo es bailarín. Solo hay un subgrupo, que es bailarín.

Nota: se ha escapado el espacio en el patrón.

Coincidencia de independencia entre mayúsculas y minúsculas

La coincidencia, como se explicó anteriormente, distingue entre mayúsculas y minúsculas. El emparejamiento se puede realizar independientemente del caso. Esto se ilustra en el siguiente código:

tiendas -snocasematch

pag='Nos gusta la buena música'.
si [[ $ str= ~ GoOd]];luego
echofundar
ser

tiendas -unocasematch

El resultado es: encontrado. El patrón es, GoOd. La subcadena coincidente es 'buena'. Observe cómo la opción nocasematch se habilitó al principio del segmento de código y se deshabilitó al final del segmento de código.

Longitud de una cuerda

La sintaxis para obtener la longitud de una cadena es:

$ {# PARAMETER}

Ejemplo:

pag='Nos gusta la buena música'.
echo $ {# str}

La salida es: 19.

Reducción de cuerdas

Las sintaxis para la reducción de cadenas son:

$ {PARAMETER: OFFSET}
$ {PARAMETER: OFFSET: LENGTH}

donde el conteo para OFFSET comienza desde cero.

El siguiente ejemplo muestra cómo eliminar los primeros 11 caracteres de una cadena:

pag='Siempre bailo con buena música'.
echo $ {str: 10}

La salida es:

ance a la buena música.

Contando para LONGITUD, comienza desde el siguiente carácter. El siguiente código muestra cómo se puede permitir una parte dentro de la cadena:

pag='Siempre bailo con buena música'.
echo $ {str: 10: 6}

La salida es:

ance t

Se eliminaron los primeros 11 caracteres; se permitieron los siguientes 6 caracteres y el resto de los caracteres se eliminaron automáticamente.

Buscar y reemplazar

Cuando se encuentra una subcadena, se puede reemplazar por otra subcadena. Las sintaxis para esto son:

dónde=$ {PARAMETER / PATTERN / REPLACEMENT}
dónde=$ {PARÁMETRO // PATRÓN / REEMPLAZO}
dónde=$ {PARAMETER / PATTERN}
dónde=$ {PARAMETER // PATTERN}

Para la primera sintaxis con barra diagonal simple, solo se reemplaza la primera coincidencia. Ejemplo:

pag=Hay una rata, un murciélago y un gato en la cámara.
Derecha=$ {str / [cbr] en / big cow}
echo $ str
echo $ ret

La salida es:

Hay una rata, un murciélago y un gato en la cámara.
Hay una vaca grande, un murciélago y un gato en la cámara.

Para la segunda sintaxis con barras diagonales dobles, se reemplazan todas las apariciones de la coincidencia. Ejemplo:

pag=Hay una rata, un murciélago y un gato en la cámara.
Derecha=$ {str // [cbr] en / gran vaca}
echo $ str
echo $ ret

La salida es:

Hay una rata, un murciélago y un gato en la cámara.
Hay una vaca grande, una vaca grande y una vaca grande en la cámara.

Para la tercera sintaxis con barra diagonal simple, no hay reemplazo para la primera y única coincidencia.

Además, se elimina la primera subcadena encontrada. Ejemplo:

pag=Hay una rata, un murciélago y un gato en la cámara.
Derecha=$ {str / [cbr] en}
echo $ str
echo $ ret

Para la cuarta sintaxis con barras diagonales dobles, no hay reemplazo para todas las coincidencias. Además, se eliminan todas las subcadenas encontradas. Ejemplo:

pag=Hay una rata, un murciélago y un gato en la cámara.
Derecha=$ {str // [cbr] en}
echo $ str
echo $ ret

La salida es:

Hay una rata, un murciélago y un gato en la cámara.
Hay un, un y un, en la cámara.

Conclusión

Para verificar si una cadena tiene una subcadena en Bash, se debe usar Pattern Matching. La concordancia de patrones no solo tiene lugar en la condición de corchetes dobles, [[. . . ]]. También puede tener lugar en la expansión de parámetros, con su $ {. . .}. Con la expansión de parámetros, es posible obtener una subcadena por índices.

Lo que se ha presentado en este artículo son los puntos más críticos en la coincidencia de patrones. ¡Hay mas! Sin embargo, lo que el lector debería estudiar a continuación es la expansión del nombre de archivo.