Kuidas kontrollida, kas string sisaldab bash -alamstringi

How Check If String Contains Substring Bash



Küsimus on selles, kuidas kontrollida, kas string sisaldab Bashis alamstringi. Vastus on: kasutage mustrite sobitamist. See tekitab veel ühe küsimuse: mis on mustrite sobitamine? Noh, lause fraasil on teatud omadused. Sellepärast erineb see teistest sama lause või muude lausete fraasidest. Omadusi saab kodeerida mustrina. Sel viisil saab stringi teatud fraasi tuvastada. Selles artiklis selgitatakse, kuidas tuvastada teatud alamstring suuremas stringis, asendada alamstring teise alamstringiga ja leida mis tahes alamstring indeksi järgi suuremas stringis. Enne seletustesse sukeldumist tuleb aga meelde tuletada erinevaid viise, kuidas string Bashis luuakse.

Keel põgenedes

Stringi saab konstrueerida, asendades iga tühiku tühiku tühjendusjärjestusega, ''; nagu:







myVar= Turism sisse Egiptus on üks riigist 's juhtivad majanduslikud tööstusharud.
viskas välja $ myVar

Väljund on:



Turism Egiptuses on üks riigi juhtivaid majandussektoreid.



Märkus: apostroof kasutas ka tühjendusjärjestust.





String üksikute jutumärkide järgi

Kas programmeerijal on aega põgeneda stringi kõikidest tühikutest? Ei. Seetõttu on parem kasutada stringi piiritlemiseks kahte ühe jutumärki; nagu näiteks:

myVar='Egiptuse turism on üks riikidest' ''juhtiv majandustööstus.'

Ühe tsitaadiga string ei võimalda ühegi põgenemisjärjestuse laiendamist (selle mõjuga asendamist). Õnneks, kui kaks stringi on üksteise kõrval kodeeritud, võetakse neid ühe stringina. Põgenemisjärjestuse saab vahele lisada, nagu ülalpool tehtud. Põgenemisjärjestust laiendatakse. Nii et väljund muutub:



Turism Egiptuses on üks riigi juhtivaid majandussektoreid.

String topeltjutumärkide järgi

Topeltjutumärkidega ei laiendata ka põgenemisjärjestusi, vaid laiendatakse muutujaid. Seda illustreerib järgmine kood:

myVar= Turism sisse Egiptus on üks riigist 's juhtivad majanduslikud tööstusharud.
viskas välja $ myVar

Väljund on:

Turism Egiptuses on üks riigi juhtivaid majandussektoreid.

Märkus: apostroof kasutas ka tühjendusjärjestust.

Selles artiklis on peamiseks vaadeldava stringi tüübiks üksikute jutumärkidega string.

Regulaaravaldise alused

Regulaarne

Mõelge sellele stringile:

See maailm pole tegelikult meie kodu.

Olgu maailm huvide alamstring. Seejärel nimetatakse suurt stringi (tervet stringi) sihtmärgiks või lihtsalt sihtmärgiks. Jutumärkides olevat „maailma” nimetatakse regulaaravaldiseks või lihtsalt regexiks. Sisu, maailm, on antud juhul muster.

Lihtne sobitamine

Kui järgmises koodis leitakse sihtmärgist sõna „maailm”, siis ütleme, et sõna on sobitatud.

lk='See maailm pole tegelikult meie kodu.'
reg='maailm'
kui [[ $ str= ~$ reg ]];siis
viskas väljaleitud
muidu
viskas väljaei leitud
olla

= ~, mis on määramisoperaator, millele järgneb ~, nimetatakse siduvaks operaatoriks. Tingimus kontrollib, kas muster on sihtstringis sobitatud. Kui sihtmärgist leitakse mustrile vastav alamstring, kuvatakse kaja lause leitud. Kui seda ei leita, kaja avaldus kaja ei leitud. Selle koodi väljund on järgmine:

leitud

Kuna muster, maailm, leitakse sihtmärgist. Pange tähele, et piiritletud tühik pärast [[ja enne]] on säilinud.

Muster

Ülaltoodud koodis on „maailm” jutumärkides regex, maailm ise on muster. See on lihtne muster. Enamik mustreid pole siiski nii lihtne. Muster on leitud alamstringi iseloomustus. Ja nii kasutab Bashi muster teatud metamärke. Meta -tegelane on tegelane teiste tegelaste kohta. Näiteks kasutab Bash Pattern järgmisi metamärke:

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

Regulaaravaldise saab sisestada ka kahekordsesse sulgusse. Kuid see ei pea olema jutumärkides. Niisiis, sel juhul on see sõna otseses mõttes muster.

Märkide klassid

Nurksulud

Leiti järgmise koodi väljund, mis tähendab, et toimus vaste:

lk='Kass tuli kambrisse.'
kui [[ $ str= ~[cbr]kl]];siis
viskas väljaleitud
olla

Muster [cbr] at on sobitunud kassiga, mis algab tähega „c” ja mis jätkub ja lõpeb at. [cbr] at tähendab sobitada 'c' või 'b' või 'r', millele järgneb at.

Leiti järgmise koodi väljund, mis tähendab, et toimus vaste:

lk='Nahkhiir tuli kambrisse.'
kui [[ $ str= ~[cbr]kl]];siis
viskas väljaleitud
olla

Muster [cbr] at on sobitanud kurika, mis algab tähega „b” ja mis jätkub ja lõpeb at. [cbr] at tähendab sobitada 'c' või 'b' või 'r', millele järgneb at.

Leiti järgmise koodi väljund, mis tähendab, et toimus vaste:

lk='Rott tuli kambrisse.'
kui [[ $ str= ~[cbr]kl]];siis
viskas väljaleitud
olla

Muster [cbr] at on sobitunud rotiga, mis algab tähega „r” ja mis jätkub ja lõpeb at.

Ülaltoodud koodinäidistes ei tea programmeerija, kas sihtstringis on kass, nahkhiir või rott. Kuid ta teab, et alamstring algab kas “c” või “b” või “r”, seejärel jätkub ja lõpeb tähega. Mustri nurksulud võimaldavad erinevatel võimalikel tähemärkidel sobitada ühte märki sihtmärgi teistega võrreldes. Niisiis, nurksulud sisaldavad märkide komplekti, millest üks sobib alamstringi jaoks. Lõpuks sobitatakse kogu alamstring.

Tegelaste valik

Ülaltoodud koodis [cbr] on klass. Isegi kui „c”, „b” või „r” vastab ühele tähemärgile, ei vasta muster kohe, kui see kohe ei vasta.

Noh, on teatud vahemikud, mis moodustavad klassi. Näiteks klassi moodustavad 0–9 numbrit, [0–9], sealhulgas 0 ja 9. Väiketähed „a” kuni „z” moodustavad klassi [a – z], sealhulgas a ja z. Suured tähed 'A' kuni 'Z' moodustavad klassi [A-Z], sealhulgas 'A' ja 'Z'. Klassist on see üks märke, mis sobiks stringi ühe tähemärgiga.

Järgmine kood annab vaste:

kui [[ 'ID8id'= ~[0-9] ]];siis
viskas väljaleitud
olla

Seekord on sihtmärk tingimusel olev sõnasõnaline string. 8, mis on üks võimalikest arvudest vahemikus [0–9], on stringis „ID8id” sobinud 8-ga. Ülaltoodud kood on samaväärne:

kui [[ 'ID8id'= ~[0123456789] ]];siis
viskas väljaleitud
olla

Siin on kõik võimalikud numbrid mustrisse kirjutatud, seega pole sidekriipsu.

Järgmises koodis saadakse vaste:

kui [[ 'ID8iD'= ~[a-z] ]];siis
viskas väljaleitud
olla

Sobivus on vahemiku väiketähtede „i”, [a – z] ja sihtstringi „ID8iD” väiketähtede „i” vahel.

Pidage meeles: vahemik on klass. Klass võib olla osa suuremast mustrist. Nii et mustris võib tekst olla tunni ees ja/või pärast seda. Seda illustreerib järgmine kood:

kui [[ „ID8id on identifikaator”= ~ ID[0-9]id ]];siis
viskas väljaleitud
olla

Väljund on: leitud. Mustri „ID8id” on sihtstringis sobinud „ID8id”.

Eitus

Sobivust ei saada järgmise koodi abil:

kui [[ '0123456789101112'= ~[^0-9] ]];siis
viskas väljaleitud
muidu
viskas väljaei leitud
olla

Väljund on:

ei leitud

Kui vahemiku ees ei oleks ^, siis nurksulgudes oleks vahemiku null sobinud sihtstringi esimese nulliga. Niisiis, ^ vahemiku (või valikuliste märkide) ees eitab klassi.

Järgmine kood loob vaste, kuna tingimus on järgmine: sobitage sihtmärgi kõik kohad, kus pole numbrit:

kui [[ 'ABCDEFGHIJ'= ~[^0-9] ]];siis
viskas väljaleitud
muidu
viskas väljaei leitud
olla

Nii et väljund on: leitud.

[^0-9] tähendab mittekohalist numbrit, seega [^0-9] on eitus [0-9].

[^a-z] tähendab väiketähte, seega [^a-z] on [a-z] eitus.

[^A-Z] tähendab mitte suurtähte, seega [^A-Z] on [A-Z] eitus.

Teised eitused on saadaval.

Periood (.) Mustris

Mustris olev periood (.) Sobib mis tahes tähemärgiga, sealhulgas temaga. Mõelge järgmisele koodile:

kui [[ „6759WXY.A3”= ~ 7.9W.Y.A]];siis
viskas väljaleitud
olla

Koodi väljund leitakse, kuna teised märgid sobivad. Üks punkt vastab ‘5’; teine ​​punkt vastab „X” -le; ja viimane punkt vastab punktile.

Sobiv vaheldus

Mõelge sellele lausele sihtstringi puhul:

Puuris on erinevat tüüpi linde.

Keegi võib soovida teada, kas sellel sihtmärgil on tuvi, paabulind või kotkas. Kasutada saab järgmist koodi:

lk='Puuris on eri tüüpi paabulinde.'
kui [[ $ str= ~ tuvi|paabulind|kotkas]];siis
viskas väljaleitud
muidu
viskas väljaei leitud
olla

Väljund on leitud. Vaheldumise metamärk, | on tööle võetud. Alternatiive võib olla kaks, kolm, neli ja rohkem. Selles koodis on sobitatud paabulind.

Rühmitamine

Järgmises mustris on tähemärkide rühmitamiseks kasutatud sulgusid:

lava (tantsija)

Siinne rühm on lavatantsija, keda ümbritsevad metategelased (ja). (tantsija) on alagrupp, samas kui lava (tantsija) on kogu rühm. Kaaluge järgmist.

(Tantsija on suurepärane)

Siin on alamrühm või alamstring, tantsija on vinge.

Alamstringid ühisosadega

Sidusrühm on isik, kellel on huvi äri vastu. Kujutage ette ettevõtet, mille veebisait on stal.com. Kujutage ette, et arvutis on üks järgmistest sihtmärkidest:

Veebisait, kaal.com, on mõeldud äri jaoks .;

On huvirühm .;

Sidusrühm töötab saidil.com;

Olgu mõni neist stringidest sihtmärk. Programmeerija võib soovida teada, kas kaal.com või sidusrühm on mis tahes sihtstringis. Tema muster oleks järgmine:

kaal.com | sidusrühm

vaheldust kasutades.

kaal on kahe sõnaga kaks korda trükitud. Seda saab vältida, sisestades mustri järgmiselt.

panus (.com | omanik)

.com | omanik on sel juhul alamrühm.

Märkus: vaheldumismärgi kasutamine sel juhul. ikka otsitakse otsingut saidilt kaal.com või sidusrühmast. Leitakse järgmise koodi väljund:

lk='Veebisait, kaal.com on ettevõtte jaoks.'
kui [[ $ str= ~ panus(.koos|hoidja) ]];siis
viskas väljaleitud
olla

Siin sobitatud alamstring on kaal.com.

BASH_REMATCH ettemääratud massiiv

BASH_REMATCH on eelmääratletud massiiv. Oletame, et mustril on rühmad. Kogu rühm sobis, läheb selle massiivi indeksi 0 lahtrisse. Esimene alamrühm sobis, läheb indeksi 1 lahtrisse; teine ​​alamrühm sobis, läheb indeksi 2 lahtrisse jne. Järgmine kood näitab, kuidas seda massiivi kasutada:

lk='Lavatantsija on tulnud.'
kui [[ $ str= ~ etapp (tantsija) ]];siis
viskas väljaleitud
olla

eestisisse $ {! BASH_REMATCH [@]};teha
printf '$ {BASH_REMATCH [i]}, '
tehtud
viskas välja

Väljund on:

leitud
lavatantsija, tantsija,

Kogu rühm on lavatantsija. On ainult üks alarühm, mis on tantsija.

Märkus: mustri tühik on tühi.

Suur- ja väiketähtede sõltumatuse sobitamine

Vastendamine, nagu eespool selgitatud, on tõstutundlik. Sobitamist saab teha juhtumist sõltumatult. Seda illustreerib järgmine kood:

kauplused -snocasematch

lk='Meile meeldib hea muusika.'
kui [[ $ str= ~ GoOd]];siis
viskas väljaleitud
olla

kauplused -unocasematch

Väljund on: leitud. Muster on GoOd. Sobiv alamstring on „hea”. Pange tähele, kuidas valik nocasematch on koodisegmendi alguses lubatud ja koodisegmendi lõpus keelatud.

Stringi pikkus

Stringi pikkuse saamiseks on süntaks järgmine:

$ {#PARAMETER}

Näide:

lk='Meile meeldib hea muusika.'
viskas välja $ {# str}

Väljund on: 19.

Stringide vähendamine

Stringide vähendamise süntaksid on järgmised:

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

kus nihke lugemine algab nullist.

Järgmine näide näitab, kuidas stringi esimesed 11 märki eemaldada:

lk='Ma tantsin alati hea muusika saatel.'
viskas välja $ {str: 10}

Väljund on:

head muusikat.

PIKKUSE lugemine algab järgmisest tähemärgist. Järgmine kood näitab, kuidas stringi osa saab lubada:

lk='Ma tantsin alati hea muusika saatel.'
viskas välja $ {str: 10: 6}

Väljund on:

ance t

Esimesed 11 märki eemaldati; järgmised 6 tähemärki olid lubatud ja ülejäänud tähemärgid eemaldati automaatselt.

Otsige ja asendage

Kui alamstring on leitud, saab selle asendada teise alamstringiga. Selle süntaksid on järgmised:

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

Esimese süntaksi puhul, millel on üks kaldkriips, asendatakse ainult esimene vaste. Näide:

lk='Kambris on rott, nahkhiir ja kass.'
õige=$ {str/[cbr] at/suur lehm}
viskas välja $ str
viskas välja $ ret

Väljund on:

Kambris on rott, nahkhiir ja kass.
Kambris on suur lehm, nahkhiir ja kass.

Teise süntaksi puhul kahekordse kaldkriipsuga asendatakse kõik mängu esinemised. Näide:

lk='Kambris on rott, nahkhiir ja kass.'
õige=$ {str // [cbr] at/suur lehm}
viskas välja $ str
viskas välja $ ret

Väljund on:

Kambris on rott, nahkhiir ja kass.
Kambris on suur lehm, suur lehm ja suur lehm.

Kolmanda süntaksi puhul, millel on üks kaldkriips, ei asendata esimest ja ainsat vastet.

Samuti kustutatakse esimene leitud alamstring. Näide:

lk='Kambris on rott, nahkhiir ja kass.'
õige=$ {str/[cbr] kell}
viskas välja $ str
viskas välja $ ret

Neljanda süntaksi puhul kahekordse ettepoole suunatud kaldkriipsuga ei asendata kõiki vasteid. Samuti kustutatakse kõik leitud alamstringid. Näide:

lk='Kambris on rott, nahkhiir ja kass.'
õige=$ {str // [cbr] kell}
viskas välja $ str
viskas välja $ ret

Väljund on:

Kambris on rott, nahkhiir ja kass.
Kambris on a, a ja a.

Järeldus

Selleks, et kontrollida, kas stringil on Bashis alamstring, tuleb kasutada mustrite sobitamist. Mustrite sobitamine ei toimu ainult kahekordses sulgudes, [[. . . ]]. See võib toimuda ka parameetrite laiendamisel, selle $ {. . .}. Parameetrite laiendamisega on võimalik saada alamstringi indeksite järgi.

Selles artiklis on esitatud mustrite sobitamise kõige kriitilisemad punktid. Neid on veel! Kuid mida lugeja peaks järgmisena uurima, on failinime laiendamine.