Com comprovar si una cadena conté una subcadena a Bash

How Check If String Contains Substring Bash



La pregunta és, com comprovar si una cadena conté una subcadena a Bash. La resposta és: utilitzeu la concordança de patrons. Això dóna lloc a una altra pregunta, que és: què és la concordança de patrons? Bé, una frase d’una frase té certes característiques. Per això es diferencia d'altres frases de la mateixa frase o d'altres frases. Les característiques es poden codificar com a patró. D'aquesta manera, es pot identificar una frase concreta d'una cadena. En aquest article s’explica com identificar una subcadena particular en una cadena més gran, substituir la subcadena que coincideix amb una altra subcadena i localitzar per índex qualsevol subcadena d’una cadena més gran. No obstant això, abans de capbussar-se en les explicacions, cal recordar les diferents maneres d’establir una cadena a Bash.

Cadena escapant espais

Es pot construir una cadena substituint cada espai per la seqüència d'escapament de l'espai, ''; com a:







myVar= Turisme dins Egipte és un del país 's indústries líders econòmiques.
trobo $ myVar

La sortida és:



El turisme a Egipte és una de les principals indústries econòmiques del país.



Nota: l'apòstrof també va utilitzar la seqüència d'escapament espacial.





Cadena per cites senzilles

El programador té temps per escapar de tots els espais d’una cadena? No, per tant, és millor utilitzar dues cometes simples per delimitar una cadena; tal com:

myVar='El turisme a Egipte és un dels països' 'les principals indústries econòmiques. '

Una cadena entre cometes no permet l'expansió (substituint-la pel seu efecte) de cap seqüència d'escapament. Afortunadament, si es codifiquen dues cadenes una al costat de l’altra, es prendran com una cadena. Es pot inserir una seqüència d'escapament pel mig, tal com es va fer més amunt. La seqüència d’escapament s’ampliaria. Així doncs, la sortida es converteix en:



El turisme a Egipte és una de les principals indústries econòmiques del país.

Cadena de cites dobles

Amb les cometes dobles, les seqüències d’escapament no s’amplien també, sinó que s’amplien les variables. El següent codi ho il·lustra:

myVar= Turisme dins Egipte és un del país 's indústries líders econòmiques.
trobo $ myVar

La sortida és:

El turisme a Egipte és una de les principals indústries econòmiques del país.

Nota: l'apòstrof també va utilitzar la seqüència d'escapament espacial.

En aquest article, el tipus principal de cadena que es considera és la cadena entre cometes simples.

Fonaments d’expressió regular

Regex

Penseu en aquesta cadena:

Aquest món no és realment casa nostra.

Que el món sigui la cadena d’interès. Llavors, la cadena gran (cadena sencera) s’anomena cadena de destinació o simplement, la destinació. El ‘món’ entre cometes s’anomena expressió regular o, simplement, l’expressió regular. El contingut, el món, és el patró, en aquest cas.

Coincidència simple

Al codi següent, si la paraula 'món' es troba a l'objectiu, diríem que la paraula s'ha coincidit.

pàg='Aquest món no és realment casa nostra'.
reg='món'
si [[ $ str= ~$ reg ]];llavors
trobotrobat
en cas contrari
trobono trobat
ser

= ~, que és l'operador d'assignació seguit de ~, s'anomena operador d'enllaç. La condició comprova si el patró coincideix amb la cadena de destinació. Si es troba una sub cadena corresponent al patró a l'objectiu, es mostrarà la sentència echo. Si no es troba, la declaració de ressò no es troba. La sortida d’aquest codi és:

trobat

Com que el patró, el món, es troba a l'objectiu. Tingueu en compte que s'ha mantingut l'espai delimitant després de [[i abans]].

Patró

Al codi anterior, 'món' entre cometes és l'expressió regular, mentre que el món mateix és el patró. Aquest és un patró senzill. No obstant això, la majoria de patrons no són tan senzills. Un patró és una caracterització d'una subcadena que es troba. Per tant, el patró Bash utilitza certs metacaracters. Un metacaracter és un personatge sobre altres personatges. Per exemple, Bash Pattern utilitza els següents metacaràcters:

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

També es pot escriure una expressió regular entre claudàtors dobles. Però no ha de ser entre cometes. Per tant, en aquest cas, és literalment un patró.

Classes de personatges

Claudàtors

Es troba la sortida del codi següent, és a dir, es produeix una coincidència:

pàg=El gat va entrar a la cambra.
si [[ $ str= ~[cbr]a]];llavors
trobotrobat
ser

El patró, [cbr] at, ha coincidit amb el gat, que comença amb ‘c’, i que continua i acaba amb a. [cbr] a significa, coincideix amb 'c' o 'b' o 'r' seguit de a.

Es troba la sortida del codi següent, és a dir, es produeix una coincidència:

pàg=—El ratpenat va entrar a la cambra.
si [[ $ str= ~[cbr]a]];llavors
trobotrobat
ser

El patró, [cbr] at, ha coincidit amb bat, que comença per ‘b’, i que continua i acaba amb a. [cbr] a significa, coincideix amb 'c' o 'b' o 'r' seguit de a.

Es troba la sortida del codi següent, és a dir, es produeix una coincidència:

pàg=La rata va entrar a la cambra.
si [[ $ str= ~[cbr]a]];llavors
trobotrobat
ser

El patró, [cbr] at ha coincidit amb la rata, que comença per ‘r’, i que continua i acaba amb a.

Als exemples de codi anteriors, el programador no sap si hi ha gat o ratpenat o rata a la cadena de destinació. Però sap que la subcadena comença per «c» o per «b» o per «r», després continua i acaba amb a. Els claudàtors d'un patró permeten a diferents personatges possibles fer coincidir un personatge en una posició en relació amb els altres de l'objectiu. Per tant, els claudàtors contenen un conjunt de caràcters, dels quals un coincideix amb una subcadena. Finalment, és la subcadena completa que es fa coincidir.

Gamma de personatges

Al codi anterior [cbr] hi ha una classe. Fins i tot si ‘c’ o ‘b’ o ‘r’ corresponen a un sol caràcter, si a continuació no coincideix, el patró no coincidirà amb res.

Bé, hi ha certs rangs que formaran una classe. Per exemple, de 0 a 9 dígits formen la classe, [0-9] amb 0 i 9 inclosos. Les minúscules «a» a «z» formen la classe [a-z] amb «a» i «z» incloses. Les majúscules 'A' a 'Z' formen la classe [A-Z] amb 'A' i 'Z' incloses. D’una classe, és un dels caràcters que coincideix amb un caràcter de la cadena.

El codi següent produeix una coincidència:

si [[ 'ID8id'= ~[0-9] ]];llavors
trobotrobat
ser

Aquesta vegada l'objectiu és una cadena literal en la condició. 8, que és un dels números possibles dins de l'interval, [0-9], ha coincidit amb 8 a la cadena 'ID8id'. El codi anterior equival a:

si [[ 'ID8id'= ~[0123456789] ]];llavors
trobotrobat
ser

Aquí, tots els números possibles s’han escrit al patró, de manera que no hi ha guionet.

Al codi següent s’obté una coincidència:

si [[ 'ID8iD'= ~[a-z] ]];llavors
trobotrobat
ser

La coincidència es troba entre la minúscula 'i' de l'interval, [a-z], i la minúscula 'i' de la cadena de destinació, 'ID8iD'.

Recordeu: el rang és una classe. La classe pot formar part d’un patró més gran. Per tant, en un patró, el text pot estar al davant i / o després de la classe. El següent codi ho il·lustra:

si [[ 'ID8id és l'identificador'= ~ ID[0-9]identificador ]];llavors
trobotrobat
ser

La sortida és: trobada. 'ID8id' del patró coincideix amb 'ID8id' a la cadena de destinació.

Negació

La coincidència no s’obté del codi següent:

si [[ '0123456789101112'= ~[^0-9] ]];llavors
trobotrobat
en cas contrari
trobono trobat
ser

La sortida és:

no trobat

Sense ^ davant de l'interval, dins dels claudàtors, el zero de l'interval hauria coincidit amb el primer zero de la cadena objectiu. Per tant, ^ davant d'un interval (o caràcters opcionals) nega la classe.

El codi següent produeix una coincidència perquè la condició es llegeix: coincideix amb qualsevol caràcter que no sigui de dígits en qualsevol lloc de l'objectiu:

si [[ 'ABCDEFGHIJ'= ~[^0-9] ]];llavors
trobotrobat
en cas contrari
trobono trobat
ser

Així doncs, la sortida és: trobada.

[^ 0-9] significa un no-dígit, de manera que [^ 0-9] és la negació de [0-9].

[^ a-z] significa una lletra no minúscula, de manera que [^ a-z] és la negació de [a-z].

[^ A-Z] significa una lletra no majúscula, de manera que [^ A-Z] és la negació de [A-Z].

Hi ha altres negacions disponibles.

El període (.) Al patró

El punt (.) Del patró coincideix amb qualsevol caràcter inclòs ell mateix. Penseu en el codi següent:

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

La sortida del codi es troba perquè els altres caràcters coincideixen. Un punt coincideix amb '5'; un altre punt coincideix amb ‘X’; i l'últim punt coincideix amb un punt.

Alternança coincident

Penseu en aquesta frase per a una cadena de destinació:

La gàbia té aus de diferents tipus.

Algú pot voler saber si aquest objectiu té colom, paó o àguila. Es pot utilitzar el següent codi:

pàg='La gàbia té paons de diferents tipus'.
si [[ $ str= ~ colom|paó|àguila]];llavors
trobotrobat
en cas contrari
trobono trobat
ser

La sortida es troba. L'alternança metacaracter, | ha estat treballat. Hi pot haver dues, tres, quatre i més alternatives. El que coincideix en aquest codi és 'paó'.

Agrupació

En el patró següent, s’han utilitzat parèntesis per agrupar caràcters:

un escenari (ballarí)

El grup aquí és un ballarí d’escena envoltat de metacaracteres (i). (ballarí) és un subgrup, mentre que un escenari (ballarí) és tot el grup. Penseu en el següent:

El (ballarí és impressionant)

Aquí, el subgrup o subcadena és, el ballarí és increïble.

Subcadenes amb parts comunes

Una part interessada és una persona interessada en un negoci. Imagineu-vos un negoci amb un lloc web, stake.com. Imagineu que una de les cadenes objectiu següents es troba a l'ordinador:

El lloc web, stake.com és per a l'empresa .;

Hi ha l'interessat .;

L'interès treballa per stake.com .;

Deixeu que qualsevol d'aquestes cadenes sigui l'objectiu. El programador pot voler saber si stake.com o stakeholder es troba en qualsevol cadena de destinació. El seu patró seria:

stake.com | stakeholder

utilitzant l’alternança.

estaca s'ha escrit dues vegades en les dues paraules. Això es pot evitar escrivint el patró de la següent manera:

estaca (.com | titular)

.com | titular és el subgrup en aquest cas.

Nota: l'ús del caràcter d'alternança en aquest cas. encara es cercarà stake.com o stakeholder. Es troba la sortida del codi següent:

pàg='El lloc web, stake.com és per a l'empresa.'
si [[ $ str= ~ estaca(.amb|titular) ]];llavors
trobotrobat
ser

La subcadena coincident aquí és stake.com.

Matriu predefinida BASH_REMATCH

BASH_REMATCH és una matriu predefinida. Suposem que un patró té grups. Tot el grup coincident entra a la cel·la de l’índex 0 d’aquesta matriu. El primer subgrup coincident entra a la cel·la de l’índex 1; el segon subgrup coincideix, entra a la cel·la de l'índex 2, etc. El codi següent mostra com utilitzar aquesta matriu:

pàg='Ha vingut el ballarí escènic'.
si [[ $ str= ~ etapa (ballarí) ]];llavors
trobotrobat
ser

perjodins $ {! BASH_REMATCH [@]};fer
printf '$ {BASH_REMATCH [i]}, '
fet
trobo

La sortida és:

trobat
ballarina d’escena, ballarina,

Tot el grup és ballarí d’escena. Només hi ha un subgrup, que és ballarí.

Nota: s'ha escapat l'espai del patró.

Coincidència d’independència entre majúscules i minúscules

La coincidència, tal com s’ha explicat anteriorment, distingeix entre majúscules i minúscules. La coincidència es pot fer independentment del cas. Això es mostra en el següent codi:

botigues -snocasematch

pàg='Ens agrada la bona música'.
si [[ $ str= ~ GoOd]];llavors
trobotrobat
ser

botigues -unocasematch

La sortida és: trobada. El patró és GoOd. La subcadena coincident és 'bona'. Tingueu en compte com s'ha activat l'opció nocasematch al començament del segment de codi i desactivada al final del segment de codi.

Longitud d'una corda

La sintaxi per obtenir la longitud d'una cadena és:

$ {# PARAMETER}

Exemple:

pàg='Ens agrada la bona música'.
trobo $ {# str}

La sortida és: 19.

Reducció de cordes

Les sintaxis per a la reducció de cadenes són:

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

on el recompte per OFFSET comença des de zero.

L'exemple següent mostra com eliminar els primers 11 caràcters d'una cadena:

pàg='Sempre ballo amb bona música'.
trobo $ {str: 10}

La sortida és:

a la bona música.

Comptant per a la LONGITUD, comença a partir del següent personatge. El codi següent mostra com es pot permetre una porció dins de la cadena:

pàg='Sempre ballo amb bona música'.
trobo $ {str: 10: 6}

La sortida és:

ance t

Es van eliminar els primers 11 caràcters; es van permetre els següents 6 caràcters i la resta de personatges es van eliminar automàticament.

Cerca i substitució

Quan es troba una subcadena, es pot substituir per una altra. Les sintaxis per a això són:

on=$ {PARAMETER / PATTERN / REPLACEMENT}
on=$ {PARAMETER // PATTERN / REPLACEMENT}
on=$ {PARAMETER / PATTERN}
on=$ {PARAMETER // PATTERN}

Per a la primera sintaxi amb barra inclinada directa, només se substitueix la primera coincidència. Exemple:

pàg='Hi ha una rata, un ratpenat i un gat a la cambra'.
dret=$ {str / [cbr] a / big cow}
trobo $ str
trobo $ ret

La sortida és:

A la cambra hi ha una rata, un ratpenat i un gat.
A la cambra hi ha una gran vaca, un ratpenat i un gat.

Per a la segona sintaxi amb barres inclinades dobles, se substitueixen totes les aparicions del partit. Exemple:

pàg='Hi ha una rata, un ratpenat i un gat a la cambra'.
dret=$ {str // [cbr] a / gran vaca}
trobo $ str
trobo $ ret

La sortida és:

A la cambra hi ha una rata, un ratpenat i un gat.
A la cambra hi ha una vaca gran, una vaca gran i una vaca gran.

Per a la tercera sintaxi amb barra inclinada directa, no hi ha cap substitució per a la primera i única coincidència.

A més, se suprimeix la primera subcadena trobada. Exemple:

pàg='Hi ha una rata, un ratpenat i un gat a la cambra'.
dret=$ {str / [cbr] a}
trobo $ str
trobo $ ret

Per a la quarta sintaxi amb barres inclinades dobles, no hi ha cap substitució per a tots els partits. A més, se suprimeixen totes les subcadenes trobades. Exemple:

pàg='Hi ha una rata, un ratpenat i un gat a la cambra'.
dret=$ {str // [cbr] a}
trobo $ str
trobo $ ret

La sortida és:

A la cambra hi ha una rata, un ratpenat i un gat.
Hi ha un, un i un, a la cambra.

Conclusió

Per comprovar si una cadena té una subcadena a Bash, s’ha d’utilitzar la concordança de patrons. La concordança de patrons no només té lloc entre parèntesis dobles, [[. . . ]]. També pot tenir lloc en l'expansió de paràmetres, amb el seu $ {. . .}. Amb l'expansió de paràmetres, és possible obtenir una subcadena per índexs.

El que s’ha presentat en aquest article són els punts més crítics de la concordança de patrons. N’hi ha més! Tot i això, el que el lector hauria d’estudiar a continuació és Expansió del nom de fitxer.