Cum să verificați dacă un șir conține un șir în Bash

How Check If String Contains Substring Bash



Întrebarea este, cum să verificăm dacă un șir conține un șir în Bash. Răspunsul este: utilizați potrivirea modelelor. Acest lucru dă naștere unei alte întrebări, care este: ce este potrivirea modelelor? Ei bine, o frază dintr-o propoziție are anumite caracteristici. De aceea diferă de alte fraze din aceeași propoziție sau din alte propoziții. Caracteristicile pot fi codificate ca model. În acest fel, poate fi identificată o anumită frază dintr-un șir. Acest articol explică modul de identificare a unui anumit șir într-un șir mai mare, înlocuirea șirului asociat cu un alt șir și localizarea oricărui șir într-un șir mai mare după index. Cu toate acestea, înainte de a vă scufunda în explicații, trebuie să ne amintim diferitele moduri în care este stabilit un șir în Bash.

Șir prin scăpare de spații

Un șir poate fi construit prin înlocuirea fiecărui spațiu cu secvența de evacuare a spațiului, „”; ca în:







myVar= Turism în Egipt este unul din țara 's conduc industriile economice.
aruncat $ myVar

Ieșirea este:



Turismul în Egipt este una dintre principalele industrii economice ale țării.



Notă: apostroful a folosit și secvența de evacuare spațială.





Șir de citate unice

Programatorul are timp să scape de toate spațiile dintr-un șir? Nu. Prin urmare, este mai bine să folosiți două ghilimele pentru a delimita un șir; precum:

myVar=„Turismul în Egipt este unul dintre țări” 'este cea mai importantă industrie economică.

Un șir de citate singure nu permite extinderea (înlocuirea cu efectul său) a niciunei secvențe de evadare. Din fericire, dacă două șiruri sunt codate una lângă alta, vor fi luate ca un șir. O secvență de evadare poate fi inserată între ele, așa cum s-a făcut mai sus. Secvența de evadare ar fi extinsă. Deci rezultatul devine:



Turismul în Egipt este una dintre principalele industrii economice ale țării.

Șir de citate duble

Cu ghilimele duble, secvențele de evadare nu sunt extinse la fel de bine, dar variabilele sunt extinse. Următorul cod ilustrează acest lucru:

myVar= Turism în Egipt este unul din țara 's conduc industriile economice.
aruncat $ myVar

Ieșirea este:

Turismul în Egipt este una dintre principalele industrii economice ale țării.

Notă: apostroful a folosit și secvența de evacuare spațială.

În acest articol, principalul tip de șir considerat este șirul între ghilimele unice.

Noțiuni fundamentale privind expresia regulată

Regex

Luați în considerare acest șir:

Această lume nu este chiar casa noastră.

Să fie lumea substratul de interes. Apoi, șirul mare (șir întreg) se numește șir țintă sau pur și simplu țintă. „Lumea” din ghilimele se numește expresie regulată sau pur și simplu, regex. Conținutul, lumea, este modelul, în acest caz.

Potrivire simplă

În următorul cod, dacă cuvântul „lume” se găsește în țintă, am spune că cuvântul a fost potrivit.

str=„Această lume nu este chiar casa noastră”.
reg='lume'
dacă [[ $str= ~$ reg ]];atunci
aruncatgăsite
altceva
aruncatnu a fost găsit
fi

= ~, care este operatorul de atribuire urmat de ~, se numește operator de legare. Condiția verifică dacă modelul se potrivește în șirul țintă. Dacă în țintă se găsește un șir corespunzător modelului, se afișează declarația de ecou găsită. Dacă nu este găsit, declarația de ecou nu este găsită. Ieșirea pentru acest cod este:

găsite

Deoarece modelul, lumea, se găsește în țintă. Rețineți că spațiul de delimitare după [[și înainte]] a fost menținut.

Model

În codul de mai sus, „lume” între ghilimele este regex, în timp ce lumea însăși este modelul. Acesta este un model simplu. Cu toate acestea, majoritatea tiparelor nu sunt atât de simple. Un tipar este o caracterizare a unui sub șir de găsit. Și astfel, modelul Bash folosește anumite metacaractere. Un metacaracter este un personaj despre alte personaje. Pentru exemple, Bash Pattern folosește următoarele metacaractere:

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

O expresie regulată poate fi, de asemenea, tastată în paranteze duble. Dar nu trebuie să fie între ghilimele. Deci, în acest caz, este literalmente un model.

Clasele de caractere

Paranteza patrata

Se găsește ieșirea următorului cod, ceea ce înseamnă că a avut loc o potrivire:

str=- Pisica a intrat în cameră.
dacă [[ $str= ~[cbr]la]];atunci
aruncatgăsite
fi

Modelul, [cbr] at are o pisică potrivită, care începe cu „c” și care continuă și se termină cu la. [cbr] at înseamnă, potriviți „c” sau „b” sau „r” urmat de la.

Se găsește ieșirea următorului cod, ceea ce înseamnă că a avut loc o potrivire:

str=- Liliacul a intrat în cameră.
dacă [[ $str= ~[cbr]la]];atunci
aruncatgăsite
fi

Modelul, [cbr] at are potrivit bat, care începe cu „b” și care continuă și se termină cu la. [cbr] at înseamnă, potriviți „c” sau „b” sau „r” urmat de la.

Se găsește ieșirea următorului cod, ceea ce înseamnă că a avut loc o potrivire:

str=- Șobolanul a intrat în cameră.
dacă [[ $str= ~[cbr]la]];atunci
aruncatgăsite
fi

Modelul, [cbr] at s-a potrivit cu șobolan, care începe cu „r” și care continuă și se termină cu la.

În exemplele de cod de mai sus, programatorul nu știe dacă pisica sau liliacul sau șobolanul există în șirul țintă. Dar știe că șirul începe fie cu „c”, fie cu „b” sau cu „r”, apoi continuă și se termină cu la. Parantezele pătrate dintr-un model permit diferitelor caractere posibile să se potrivească cu un caracter într-o poziție față de altele din țintă. Deci, parantezele pătrate conțin un set de caractere, dintre care unul se potrivește pentru un șir. În cele din urmă, este coroana completă potrivită.

Gama de caractere

În codul de mai sus [cbr] este o clasă. Chiar dacă „c” sau „b” sau „r” corespund unui singur caracter, dacă urmează imediat nu se potrivește, modelul nu se va potrivi cu nimic.

Ei bine, există anumite intervale care vor forma o clasă. De exemplu, 0 până la 9 cifre formează clasa, [0-9] cu 0 și 9 incluse. Minusculele „a” până la „z” formează clasa [a-z] cu „a” și „z” incluse. Majusculele „A” până la „Z” formează clasa [A-Z] cu „A” și „Z” incluse. Dintr-o clasă, este unul dintre personajele care s-ar potrivi cu un caracter din șir.

Următorul cod produce o potrivire:

dacă [[ „ID8id”= ~[0-9] ]];atunci
aruncatgăsite
fi

De data aceasta ținta este un șir literal în condiție. 8, care este unul dintre numerele posibile din interval, [0-9], s-a potrivit cu 8 în șir, „ID8id”. Codul de mai sus este echivalent cu:

dacă [[ „ID8id”= ~[0123456789] ]];atunci
aruncatgăsite
fi

Aici, toate numerele posibile au fost scrise în model, deci nu există cratimă.

În următorul cod, se obține o potrivire:

dacă [[ „ID8iD”= ~[a-z] ]];atunci
aruncatgăsite
fi

Potrivirea este între minusculele „i” din interval, [a-z] și minusculele „i” ale șirului țintă, „ID8iD”.

Amintiți-vă: gama este o clasă. Clasa poate face parte dintr-un model mai mare. Deci, într-un model, textul poate fi în față și / sau după curs. Următorul cod ilustrează acest lucru:

dacă [[ „ID8id este identificatorul”= ~ ID[0-9]id ]];atunci
aruncatgăsite
fi

Ieșirea este: găsită. „ID8id” din model s-a potrivit cu „ID8id” în șirul țintă.

Negare

Potrivirea nu se obține din următorul cod:

dacă [[ „0123456789101112”= ~[^0-9] ]];atunci
aruncatgăsite
altceva
aruncatnu a fost găsit
fi

Ieșirea este:

nu a fost găsit

Fără ^ în fața intervalului, între paranteze pătrate, zero din interval ar fi egalat cu primul zero al șirului țintă. Deci, ^ în fața unui interval (sau a caracterelor opționale) neagă clasa.

Următorul cod produce o potrivire deoarece condiția se citește: potriviți orice caracter fără cifre oriunde în țintă:

dacă [[ „ABCDEFGHIJ”= ~[^0-9] ]];atunci
aruncatgăsite
altceva
aruncatnu a fost găsit
fi

Deci rezultatul este: găsit.

[^ 0-9] înseamnă o non-cifră, deci [^ 0-9] este negarea lui [0-9].

[^ a-z] înseamnă o literă fără litere mici, deci [^ a-z] este negarea lui [a-z].

[^ A-Z] înseamnă o literă care nu este majusculă, deci [^ A-Z] este negarea lui [A-Z].

Sunt disponibile și alte negații.

Perioada (.) Din model

Punctul (.) Din model se potrivește cu orice caracter, inclusiv cu el însuși. Luați în considerare următorul cod:

dacă [[ „6759WXY.A3”= ~ 7.9W.Y.A]];atunci
aruncatgăsite
fi

Ieșirea codului se găsește deoarece celelalte caractere se potrivesc. Un punct se potrivește cu „5”; un alt punct se potrivește cu „X”; iar ultimul punct se potrivește cu un punct.

Alternare potrivită

Luați în considerare această propoziție pentru un șir țintă:

Cușca are păsări de diferite tipuri.

Cineva ar putea dori să știe dacă această țintă are porumbel, păun sau vultur. Se poate utiliza următorul cod:

str=„Cușca are păuni de diferite tipuri.”
dacă [[ $str= ~ porumbel|păun|vultur]];atunci
aruncatgăsite
altceva
aruncatnu a fost găsit
fi

Rezultatul este, găsit. Metacaracterul alternativ, | a fost angajat. Pot exista două, trei, patru și mai multe alternative. Ceea ce s-a potrivit în acest cod este „păun”.

Gruparea

În următorul model, parantezele au fost folosite pentru a grupa caractere:

o scenă (dansatoare)

Grupul de aici este un dansator de scenă înconjurat de metacaractere (și). (dansator) este un subgrup, în timp ce un stadiu (dansator) este întregul grup. Luați în considerare următoarele:

(Dansatorul este minunat)

Aici, subgrupul sau șirul este, dansatorul este minunat.

Șiruri cu părți comune

Un părți interesate este o persoană cu un interes într-o afacere. Imaginați-vă o afacere cu un site web, stake.com. Imaginați-vă că una dintre următoarele șiruri țintă se află în computer:

Site-ul, stake.com este destinat afacerii .;

Există părțile interesate .;

Părțile interesate lucrează pentru stake.com .;

Lasă oricare dintre aceste șiruri să fie ținta. Programatorul poate dori să știe dacă stake.com sau stakeholder se află în orice șir țintă. Modelul său ar fi:

stake.com | stakeholder

folosind alternanța.

miza a fost tastată de două ori în cele două cuvinte. Acest lucru poate fi evitat tastând modelul după cum urmează:

miza (.com | titular)

.com | titular este subgrupul în acest caz.

Notă: utilizarea caracterului alternativ în acest caz. stake.com sau părțile interesate vor fi în continuare căutate. Se găsește ieșirea următorului cod:

str=„Site-ul, stake.com este destinat afacerii.”
dacă [[ $str= ~ miza(.cu|titular) ]];atunci
aruncatgăsite
fi

Șirul care se potrivește aici este stake.com.

Matricea predefinită BASH_REMATCH

BASH_REMATCH este o matrice predefinită. Să presupunem că un model are grupuri. Întregul grup potrivit, intră în celulă pentru indexul 0 al acestei matrice. Primul subgrup potrivit, intră în celulă pentru indexul 1; al doilea subgrup potrivit, intră în celulă pentru indexul 2 și așa mai departe. Următorul cod arată cum să utilizați această matrice:

str=- A venit dansatorul de scenă.
dacă [[ $str= ~ etapa (dansator) ]];atunci
aruncatgăsite
fi

pentrueuîn $ {! BASH_REMATCH [@]};do
printf '$ {BASH_REMATCH [i]},
Terminat
aruncat

Ieșirea este:

găsite
dansator de scena, dansator,

Întregul grup este dansator de scenă. Există un singur subgrup, care este dansator.

Notă: spațiul din model a fost scăpat.

Potrivirea independenței majusculelor / minusculelor

Potrivirea, așa cum s-a explicat mai sus, este sensibilă la majuscule și minuscule. Potrivirea se poate face independent de caz. Acest lucru este ilustrat în următorul cod:

magazine -snocasematch

str=„Ne place muzica bună”.
dacă [[ $str= ~ GoOd]];atunci
aruncatgăsite
fi

magazine -unocasematch

Ieșirea este: găsită. Modelul este, GoOd. Șirul potrivit este „bun”. Rețineți cum a fost activată opțiunea nocasematch la începutul segmentului de cod și dezactivată la sfârșitul segmentului de cod.

Lungimea unui șir

Sintaxa pentru a obține lungimea unui șir este:

$ {# PARAMETER}

Exemplu:

str=„Ne place muzica bună”.
aruncat ${#str}

Ieșirea este: 19.

Reducerea șirurilor

Sintaxele pentru reducerea șirurilor sunt:

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

unde numărarea pentru OFFSET începe de la zero.

Următorul exemplu arată cum să eliminați primele 11 caractere ale unui șir:

str=„Întotdeauna dansez pe muzică bună.”
aruncat ${str:10}

Ieșirea este:

dorința muzicii bune.

Numărul pentru LUNGIME, începe de la următorul personaj. Următorul cod arată cum poate fi permisă o porțiune din șir:

str=„Întotdeauna dansez pe muzică bună.”
aruncat ${str:10:6}

Ieșirea este:

ance t

Primele 11 caractere au fost eliminate; următoarele 6 caractere au fost permise, iar restul personajelor au fost eliminate automat.

Căutați și înlocuiți

Când se găsește un șir, acesta poate fi înlocuit cu un alt șir. Sintaxele pentru aceasta sunt:

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

Pentru prima sintaxă cu o singură bară directă, doar primul meci este înlocuit. Exemplu:

str=- Există un șobolan, un liliac și o pisică în cameră.
dreapta=$ {str / [cbr] la / vaca mare}
aruncat $str
aruncat $ ret

Ieșirea este:

Există un șobolan, un liliac și o pisică, în cameră.
În cameră există o vacă mare, un liliac și o pisică.

Pentru a doua sintaxă cu bare oblice duble înainte, toate aparițiile meciului sunt înlocuite. Exemplu:

str=- Există un șobolan, un liliac și o pisică în cameră.
dreapta=$ {str // [cbr] la / vaca mare}
aruncat $str
aruncat $ ret

Ieșirea este:

Există un șobolan, un liliac și o pisică, în cameră.
Există o vacă mare, o vacă mare și o vacă mare, în cameră.

Pentru a treia sintaxă cu o singură bară directă, nu există înlocuire pentru primul și singurul meci.

De asemenea, primul șir găsit este șters. Exemplu:

str=- Există un șobolan, un liliac și o pisică în cameră.
dreapta=$ {str / [cbr] la}
aruncat $str
aruncat $ ret

Pentru a patra sintaxă cu bare oblice duble înainte, nu există nicio înlocuire pentru toate meciurile. De asemenea, toate șirurile găsite sunt șterse. Exemplu:

str=- Există un șobolan, un liliac și o pisică în cameră.
dreapta=$ {str // [cbr] at}
aruncat $str
aruncat $ ret

Ieșirea este:

Există un șobolan, un liliac și o pisică, în cameră.
Există un, un și un, în cameră.

Concluzie

Pentru a verifica dacă un șir are un șir în Bash, trebuie să se utilizeze potrivirea modelelor. Potrivirea modelelor nu are loc doar în paranteze duble, [[. . . ]]. Poate avea loc și în extinderea parametrilor, cu $ {. . .}. Cu extinderea parametrilor, este posibil să se obțină un sub șir de indici.

Ceea ce a fost prezentat în acest articol sunt cele mai critice puncte din potrivirea modelelor. Mai sunt! Cu toate acestea, ceea ce cititorul ar trebui să studieze în continuare, este Extinderea numelui de fișier.