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] ]];sittenheitti 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] ]];sittenheitti poislöytyi
olla
Tässä kaikki mahdolliset numerot on kirjoitettu kuvioon, joten yhdysviivaa ei ole.
Seuraavassa koodissa saadaan osuma:
jos [[ 'ID8iD'= ~[a-z] ]];sittenheitti 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 ]];sittenheitti 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] ]];sittenheitti 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] ]];sittenheitti 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]];sittenheitti 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 -snocasematchs='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.