Kuinka tarkistaa, sisältääkö merkkijono Bash -merkkijonon

How Check If String Contains Substring Bash

Kysymys kuuluu, miten tarkistaa, sisältääkö merkkijono Bash -merkkijonon. Vastaus on: käytä Pattern Matchingia. Tämä herättää toisen kysymyksen, joka on: mikä on kuvioiden sovitus? No, lauseen lauseella on tiettyjä ominaisuuksia. Siksi se eroaa muista lauseista samassa lauseessa tai muissa lauseissa. Ominaisuudet voidaan koodata kuviona. Tällä tavalla merkkijonon tietty lause voidaan tunnistaa. Tässä artikkelissa kerrotaan, kuinka voit tunnistaa tietyn alimerkkijonon suuremmasta merkkijonosta, korvata toiselle alimerkkijonolle sopivan alimerkkijonon ja etsiä minkä tahansa alimerkkijonon suuremmasta merkkijonosta indeksin mukaan. Ennen kuin sukellat selityksiin, sinun on kuitenkin muistettava eri tapoja, joilla merkkijono luodaan Bashissa.

Merkkijono Escaping Spacesista

Jono voidaan rakentaa korvaamalla jokainen välilyönti välilyönnillä, ; kuten:



myVar= Matkailu sisään Egypti on yksi maasta 's johtava talouden teollisuus.
heitti pois $ myVar

Lähtö on:



Egyptin matkailu on yksi maan johtavista talouden aloista.



Huomautus: heittomerkki käytti myös avaruuden poistumisjärjestystä.

Jono yksittäisten lainausten perusteella

Onko ohjelmoijalla aikaa paeta kaikkia merkkijonon välilyöntejä? Ei. Siksi on parempi käyttää kahta yksittäistä lainausmerkkiä merkkijonon rajaamiseen; kuten:

myVar='Egyptin matkailu on yksi maista' ''' johtava talouden teollisuus. '

Yksin lainausmerkkijono ei salli minkään paetajakson laajentamista (korvaamista sen vaikutuksella). Onneksi jos kaksi merkkijonoa koodataan vierekkäin, ne pidetään yhtenä merkkijonona. Pakosarja voidaan lisätä väliin, kuten edellä on tehty. Poistumisjärjestystä laajennettaisiin. Tulokseksi tulee siis:



Egyptin matkailu on yksi maan johtavista talouden aloista.

Jono kaksoislainausmerkeillä

Kaksoislainausmerkeissä paeta sekvenssejä ei myöskään laajenneta, mutta muuttujia laajennetaan. Seuraava koodi havainnollistaa tätä:

myVar= Matkailu sisään Egypti on yksi maasta 's johtava talouden teollisuus.
heitti pois $ myVar

Lähtö on:

Egyptin matkailu on yksi maan johtavista talouden aloista.

Huomautus: heittomerkki käytti myös avaruuden poistumisjärjestystä.

Tässä artikkelissa tärkein tarkasteltava merkkijono on lainausmerkkijono.

Säännöllisen lausekkeen perusteet

Regex

Harkitse tätä merkkijonoa:

Tämä maailma ei todellakaan ole kotimme.

Olkoon maailma kiinnostuksen osajoukko. Sitten suurta merkkijonoa (koko merkkijono) kutsutaan kohdejonoksi tai yksinkertaisesti kohteeksi. 'Maailmaa' lainausmerkeissä kutsutaan säännölliseksi lausekkeeksi tai yksinkertaisesti regexiksi. Sisältö, maailma, on malli tässä tapauksessa.

Yksinkertainen sovitus

Jos seuraavassa koodissa löytyy sana 'maailma', sanomme, että sana on sovitettu.

s='Tämä maailma ei ole oikeastaan ​​kotimme.'
reg='maailman'
jos [[ $ str= ~$ reg ]];sitten
heitti poislöytyi
muu
heitti poisei löydetty
olla

= ~, joka on osoitusoperaattori ja jota seuraa ~, kutsutaan sidontaoperaattoriksi. Ehto tarkistaa, vastaako kuvio kohdejonossa. Jos kohteesta löytyy mallia vastaava alimerkkijono, kaikulauseke näyttää löydetyn. Jos sitä ei löydy, kaikulausetta ei löydy. Tämän koodin lähtö on:

löytyi

Kuten malli, maailma, löytyy kohteesta. Huomaa, että rajaava väli [[ja ennen]] jälkeen on säilytetty.

Kuvio

Yllä olevassa koodissa 'maailma' lainausmerkeissä on säännöllinen lauseke, kun taas maailma itse on malli. Tämä on suoraviivainen malli. Useimmat mallit eivät kuitenkaan ole niin yksinkertaisia. Kuvio on löydettävän alijonon kuvaus. Ja niin, Bash -kuvio käyttää tiettyjä metamerkkejä. Metamerkki on hahmo muista hahmoista. Esimerkiksi Bash Pattern käyttää seuraavia metamerkkejä:

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

Säännöllinen lauseke voidaan myös kirjoittaa ehtojen kaksoissulkeisiin. Mutta sen ei tarvitse olla lainausmerkeissä. Joten tässä tapauksessa se on kirjaimellisesti malli.

Hahmoluokat

Hakasulkeet

Seuraavan koodin tulos löytyy, mikä tarkoittaa osumaa:

s='Kissa tuli kammioon.'
jos [[ $ str= ~[cbr]klo]];sitten
heitti poislöytyi
olla

Kuvio [cbr] at on täsmäänyt kissaan, joka alkaa c: llä ja joka jatkuu ja päättyy at. [cbr] at tarkoittaa, vastaa 'c' tai 'b' tai 'r' ja sen jälkeen at.

Seuraavan koodin tulos löytyy, mikä tarkoittaa osumaa:

s='Lepakko tuli kammioon.'
jos [[ $ str= ~[cbr]klo]];sitten
heitti poislöytyi
olla

Kuviossa [cbr] at on täsmätty bat, joka alkaa ”b” ja joka jatkuu ja päättyy at. [cbr] at tarkoittaa, vastaa 'c' tai 'b' tai 'r' ja sen jälkeen at.

Seuraavan koodin tulos löytyy, mikä tarkoittaa osumaa:

s='Rotta tuli kammioon.'
jos [[ $ str= ~[cbr]klo]];sitten
heitti poislöytyi
olla

Kuvio [cbr] at on sopinut rotalle, joka alkaa r: llä ja joka jatkuu ja päättyy at.

Yllä olevissa koodinäytteissä ohjelmoija ei tiedä, onko kohdejonossa kissa, lepakko tai rotta. Mutta hän tietää, että alimerkkijono alkaa joko 'c' tai 'b' tai 'r', sitten jatkuu ja päättyy kohtaan. Kuvion hakasulkeet mahdollistavat sen, että eri mahdolliset merkit vastaavat yhtä merkkiä kohdassa, joka on suhteessa kohteen muihin. Hakasulkeet sisältävät siis joukon merkkejä, joista yksi vastaa alijonoa. Lopuksi se on täydellinen alimerkkijono.

Hahmovalikoima

Yllä olevassa koodissa [cbr] on luokka. Vaikka 'c' tai 'b' tai 'r' vastaa yhtä merkkiä, jos seuraava ei heti vastaa, kuvio ei vastaa mitään.

No, on tiettyjä alueita, jotka muodostavat luokan. Esimerkiksi 0-9 numeroa muodostavat luokan, [0-9] ja 0 ja 9 sisältyvät. Pienet kirjaimet 'a'-'z' muodostavat luokan [a-z] ja 'a' ja 'z' mukana. Isot kirjaimet 'A'-'Z' muodostavat luokan [A-Z] ja 'A' ja 'Z'. Luokalta se on yksi merkeistä, jotka vastaavat yhtä merkkijonoa.

Seuraava koodi tuottaa osuman:

jos [[ 'ID8id'= ~[0-9] ]];sitten
heitti poislöytyi
olla

Tällä kertaa kohde on ehdollinen kirjaimellinen merkkijono. 8, joka on yksi mahdollisista numeroista alueella [0-9], on vastannut 8 merkkijonossa ID8id. Yllä oleva koodi vastaa:

jos [[ 'ID8id'= ~[0123456789] ]];sitten
heitti poislöytyi
olla

Tässä kaikki mahdolliset numerot on kirjoitettu kuvioon, joten yhdysviivaa ei ole.

Seuraavassa koodissa saadaan osuma:

jos [[ 'ID8iD'= ~[a-z] ]];sitten
heitti poislöytyi
olla

Osuma on alueen pienen kirjaimen 'i', [a-z] ja kohdejonon 'ID8iD' pienen kirjaimen 'i' välillä.

Muista: alue on luokka. Luokka voi olla osa suurempaa mallia. Joten kuvioissa teksti voi olla luokan edessä ja/tai sen jälkeen. Seuraava koodi havainnollistaa tätä:

jos [[ 'ID8id on tunnus'= ~ Tunnus[0-9]id ]];sitten
heitti poislöytyi
olla

Tulos on: löytynyt. Kuvion 'ID8id' on vastannut kohdejonossa olevaa 'ID8id'.

Kieltäminen

Vastaavuutta ei saada seuraavasta koodista:

jos [[ '0123456789101112'= ~[^0-9] ]];sitten
heitti poislöytyi
muu
heitti poisei löydetty
olla

Lähtö on:

ei löydetty

Ilman ^ alueen edessä hakasulkeissa alueen nolla olisi vastannut kohdejonon ensimmäistä nollaa. Joten ^ alueen (tai valinnaisten merkkien) edessä mitätöi luokan.

Seuraava koodi tuottaa osuman, koska ehto lukee: vastaa mitä tahansa ei-numeroista merkkiä missä tahansa kohteessa:

jos [[ 'ABCDEFGHIJ'= ~[^0-9] ]];sitten
heitti poislöytyi
muu
heitti poisei löydetty
olla

Tulos on siis: löytynyt.

[^0-9] tarkoittaa ei-numeroa, joten [^0-9] on kielto [0-9].

[^a-z] tarkoittaa ei-pieniä kirjaimia, joten [^a-z] on [a-z]: n kielto.

[^A-Z] tarkoittaa ei-isoja kirjaimia, joten [^A-Z] on [A-Z]: n kielto.

Muita negatiivisia on saatavilla.

Kausi (.) Kuviossa

Kuvion piste (.) Vastaa mitä tahansa merkkiä, myös itseään. Harkitse seuraavaa koodia:

jos [[ '6759WXY.A3'= ~ 7.9W.Y.A]];sitten
heitti poislöytyi
olla

Koodin lähtö löytyy, koska muut merkit vastaavat. Yksi piste vastaa '5'; toinen piste vastaa ”X”; ja viimeinen piste vastaa pistettä.

Vastaava vaihtoehto

Harkitse tätä virkettä kohdejonolle:

Häkissä on erityyppisiä lintuja.

Joku saattaa haluta tietää, onko tällä kohteella kyyhkynen, riikinkukko tai kotka. Seuraavaa koodia voidaan käyttää:

s='Häkissä on erityyppisiä riikinkukkoja.'
jos [[ $ str= ~ kyyhkynen|riikinkukko|kotka]];sitten
heitti poislöytyi
muu
heitti poisei löydetty
olla

Lähtö on löytynyt. Vuorottelun metamerkki, | on ollut töissä. Vaihtoehtoja voi olla kaksi, kolme, neljä ja enemmän. Tässä koodissa on 'riikinkukko'.

Ryhmittely

Seuraavassa mallissa sulkuja on käytetty merkkien ryhmittelyyn:

lava (tanssija)

Ryhmä on lavatanssija, jota ympäröivät metamerkit (ja). (tanssija) on alaryhmä, kun taas lava (tanssija) on koko ryhmä. Harkitse seuraavaa:

(Tanssija on mahtava)

Tässä alaryhmä tai alijono on, tanssija on mahtava.

Alijonot, joissa on yhteisiä osia

Sidosryhmä on henkilö, joka on kiinnostunut yrityksestä. Ajattele yritystä, jolla on verkkosivusto, stal.com. Kuvittele, että tietokoneessa on jokin seuraavista kohdejonoista:

Verkkosivusto, pea.com on yritystä varten .;

On sidosryhmä .;

Sidosryhmä toimii osoitteessa wage.com .;

Olkoon mikä tahansa näistä merkkijonoista kohde. Ohjelmoija saattaa haluta tietää, onko panos.com tai sidosryhmä missä tahansa kohdejonossa. Hänen mallinsa olisi:

svar.com | sidosryhmä

vuorottelua käyttämällä.

panos on kirjoitettu kahdesti kahteen sanaan. Tämä voidaan välttää kirjoittamalla kuvio seuraavasti:

panos (.com | haltija)

.com | haltija on tässä tapauksessa alaryhmä.

Huomautus: vaihtoehtoisen merkin käyttö tässä tapauksessa. Sivustoa tai sidosryhmää etsitään edelleen. Seuraavan koodin tulos löytyy:

s='Verkkosivusto, wage.com on yritystä varten.'
jos [[ $ str= ~ panos(.kanssa|pidin) ]];sitten
heitti poislöytyi
olla

Tässä osuva alijono on staari.com.

Esiasetettu BASH_REMATCH -järjestelmä

BASH_REMATCH on ennalta määritetty taulukko. Oletetaan, että mallilla on ryhmiä. Koko ryhmä täsmää, menee tämän taulukon indeksin 0 soluun. Ensimmäinen aliryhmä täsmää, menee indeksin 1 soluun; toinen alaryhmä täsmää, menee indeksin 2 soluun ja niin edelleen. Seuraava koodi näyttää kuinka tätä taulukkoa käytetään:

s='Lava -tanssija on tullut.'
jos [[ $ str= ~ vaihe (tanssija) ]];sitten
heitti poislöytyi
olla

vartenisisään $ {! BASH_REMATCH [@]};tehdä
printf ''$ {BASH_REMATCH [i]}, '
tehty
heitti pois

Lähtö on:

löytyi
lavatanssija, tanssija,

Koko ryhmä on lavatanssija. On vain yksi alaryhmä, joka on tanssija.

Huomautus: kuvion välilyönti on poistettu.

Isot/pienet kirjaimet riippumattomuus

Täsmäytys, kuten edellä selitettiin, erottaa kirjaimet ja kirjaimet. Yhdistäminen voidaan tehdä tapauksesta riippumatta. Tämä näkyy seuraavassa koodissa:

kauppoja -snocasematch

s='Pidämme hyvästä musiikista.'
jos [[ $ str= ~ GoOd]];sitten
heitti poislöytyi
olla

kauppoja -unocasematch

Tulos on: löytynyt. Kuvio on GoOd. Yhteensopiva alijono on 'hyvä'. Huomaa, kuinka nocasematch -vaihtoehto on otettu käyttöön koodisegmentin alussa ja poistettu käytöstä koodisegmentin lopussa.

Merkkijonon pituus

Merkkijonon pituuden saamisen syntaksi on:

$ {#PARAMETER}

Esimerkki:

s='Pidämme hyvästä musiikista.'
heitti pois $ {# str}

Tulos on: 19.

Merkkijonon pienennys

Merkkijonon pienentämisen syntaksit ovat:

$ {PARAMETRI: POIKKEUS}
$ {PARAMETER: OFFSET: LENGTH}

jossa OFFSET -laskenta alkaa nollasta.

Seuraava esimerkki näyttää kuinka merkkijonon 11 ensimmäistä merkkiä poistetaan:

s='Tanssin aina hyvän musiikin mukaan.'
heitti pois $ {str: 10}

Lähtö on:

hyvää musiikkia.

PITUUDEN laskeminen alkaa seuraavasta merkistä. Seuraava koodi osoittaa, kuinka merkkijonon osa voidaan sallia:

s='Tanssin aina hyvän musiikin mukaan.'
heitti pois $ {str: 10: 6}

Lähtö on:

ance t

Ensimmäiset 11 merkkiä poistettiin; seuraavat 6 merkkiä sallittiin, ja loput merkit poistettiin automaattisesti.

Etsi ja korvaa

Kun alimerkkijono löytyy, se voidaan korvata toisella alimerkkijonolla. Tämän syntaksit ovat:

missä=$ {PARAMETRI/KUVA/VAIHTO}
missä=$ {PARAMETER // PATTERN/REPLACEMENT}
missä=$ {PARAMETER/PATTERN}
missä=$ {PARAMETER // PATTERN}

Ensimmäisessä syntaksissa, jossa on yksi vinoviiva, vain ensimmäinen ottelu korvataan. Esimerkki:

s='Kammiossa on rotta, lepakko ja kissa.'
oikein=$ {str/[cbr] at/iso lehmä}
heitti pois $ str
heitti pois $ ret

Lähtö on:

Kammiossa on rotta, lepakko ja kissa.
Kammiossa on iso lehmä, lepakko ja kissa.

Toisessa syntaksissa, jossa on kaksinkertaiset vinoviivat, kaikki ottelun esiintymät korvataan. Esimerkki:

s='Kammiossa on rotta, lepakko ja kissa.'
oikein=$ {str // [cbr] at/iso lehmä}
heitti pois $ str
heitti pois $ ret

Lähtö on:

Kammiossa on rotta, lepakko ja kissa.
Kammiossa on iso lehmä, iso lehmä ja iso lehmä.

Kolmannessa syntaksissa, jossa on yksi vinoviiva, ensimmäistä ja ainoaa ottelua ei korvata.

Lisäksi ensimmäinen löydetty alimerkkijono poistetaan. Esimerkki:

s='Kammiossa on rotta, lepakko ja kissa.'
oikein=$ {str/[cbr] klo}
heitti pois $ str
heitti pois $ ret

Neljännelle syntaksille, jossa on kaksinkertaiset eteenpäinviivat, kaikkia otteluita ei korvata. Lisäksi kaikki löydetyt alijonot poistetaan. Esimerkki:

s='Kammiossa on rotta, lepakko ja kissa.'
oikein=$ {str // [cbr] at}
heitti pois $ str
heitti pois $ ret

Lähtö on:

Kammiossa on rotta, lepakko ja kissa.
Kammiossa on a, a ja a.

Johtopäätös

Jotta voidaan tarkistaa, onko merkkijonossa Bash -alijonoa, on käytettävä kuvionhakua. Kuvioiden täsmäytys ei tapahdu vain kaksoissulkeissa, [[. . . ]]. Se voi tapahtua myös parametrien laajennuksessa, sen $ {. . .}. Parametrien laajennuksella on mahdollista saada alimerkkijono indeksien mukaan.

Tässä artikkelissa esitetyt ovat kriittisimpiä kohtia hahmontunnistuksessa. Siellä on lisää! Lukijan tulisi kuitenkin seuraavaksi tutkia tiedostonimen laajennusta.