Hogyan lehet ellenőrizni, hogy egy karakterlánc tartalmaz -e alstringet a Bash -ban

How Check If String Contains Substring Bash



A kérdés az, hogyan lehet ellenőrizni, hogy egy karakterlánc tartalmaz -e alstringet a Bash -ban. A válasz: használja a Mintaegyeztetést. Ez újabb kérdést vet fel, ami a következő: mi a mintaegyezés? Nos, egy mondat egy mondata bizonyos tulajdonságokkal rendelkezik. Ezért különbözik az azonos mondatban vagy más mondatokban található más kifejezésektől. A jellemzők mintázatként kódolhatók. Ily módon egy karakterlánc adott kifejezése azonosítható. Ez a cikk elmagyarázza, hogyan lehet azonosítani egy adott alláncot egy nagyobb karakterláncban, kicserélni egy másik alláncra illeszkedő alstringet, és index szerint megkeresni egy tetszőleges alláncot egy nagyobb karakterláncban. Mielőtt azonban belemerülne a magyarázatokba, fel kell idéznie a karakterlánc létrehozásának különböző módjait a Bash -ban.

Húr a menekülő terekből

Egy karakterlánc felépíthető úgy, hogy minden szóközt lecserélünk a szóközök sorrendjére, a ; mint a:







myVar= Turizmus ban ben Egyiptom az egy ország 's vezető gazdasági iparágak.
kidobta $ myVar

A kimenet:



Az egyiptomi turizmus az ország egyik vezető gazdasági ágazata.



Megjegyzés: az aposztróf a térkihagyási sorrendet is használta.





Karakterlánc egyetlen idézet alapján

Van -e ideje a programozónak arra, hogy elmeneküljön a karakterlánc összes szóközéből? Nem. Ezért jobb két idézőjel használata a karakterlánc határolására; mint például:

myVar='Az idegenforgalom Egyiptomban az egyik ország' ''vezető gazdasági iparágak.'

Az egy idézőjeles karakterlánc nem teszi lehetővé semmilyen menekülési sorozat kibővítését (helyettesítését annak hatásával). Szerencsére, ha két karakterláncot egymás mellett kódolnak, akkor azokat egy karakterláncnak kell tekinteni. Egy menekülési szekvencia beilleszthető közéjük, a fentiek szerint. A menekülési sorrend kibővül. Tehát a kimenet a következő lesz:



Az egyiptomi turizmus az ország egyik vezető gazdasági ágazata.

Karakterlánc kettős idézetek alapján

Dupla idézőjelek esetén a menekülési szekvenciák szintén nem, de a változók kibővülnek. A következő kód ezt szemlélteti:

myVar= Turizmus ban ben Egyiptom az egy ország 's vezető gazdasági iparágak.
kidobta $ myVar

A kimenet:

Az egyiptomi turizmus az ország egyik vezető gazdasági ágazata.

Megjegyzés: az aposztróf a térkihagyási sorrendet is használta.

Ebben a cikkben a fő fontosságú karakterlánc az idézőjeles karakterlánc.

A reguláris kifejezés alapjai

Regex

Tekintsük ezt a karakterláncot:

Ez a világ nem igazán az otthonunk.

Legyen a világ az érdeklődés részsora. Ezután a nagy karakterláncot (egész karakterlánc) nevezzük célszalagnak vagy egyszerűen a célnak. Az idézőjelben szereplő „világot” reguláris kifejezésnek vagy egyszerűen regexnek nevezik. Ebben az esetben a tartalom, a világ a minta.

Egyszerű párosítás

A következő kódban, ha a „világ” szó megtalálható a célpontban, azt mondjuk, hogy a szó illeszkedik.

o=- Ez a világ nem igazán az otthonunk.
reg='világ'
ha [[ $ str= ~$ reg ]];azután
kidobtamegtalált
más
kidobtanem található
lenni

= ~, amely a hozzárendelési operátor, amelyet a ~ követ, kötési operátornak nevezzük. A feltétel ellenőrzi, hogy a minta illeszkedik -e a célstringen. Ha a mintának megfelelő alstringet talál a célpontban, az echo utasítás a talált elemet jeleníti meg. Ha nem található, akkor az echo utasítás visszhangzik. Ennek a kódnak a kimenete:

megtalált

Ahogy a minta, a világ megtalálható a célpontban. Ne feledje, hogy a [[és előtte]] utáni határoló szóköz megmaradt.

Minta

A fenti kódban az idézőjelben szereplő „világ” a regex, míg maga a világ a minta. Ez egy egyszerű minta. A legtöbb minta azonban nem ilyen egyszerű. A minta a keresendő allánc karakterisztikája. Tehát a Bash minta bizonyos metakaraktereket használ. A metakarakter egy karakter más karakterekről. Például a Bash Pattern a következő metakaraktereket használja:

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

Szabályos kifejezés is beírható a feltétel kettős zárójelbe. De nem feltétlenül idézőjelben kell szerepelnie. Tehát ebben az esetben ez szó szerint egy minta.

Karakterosztályok

Szögletes zárójelek

A következő kód kimenete található, azaz egyezés történt:

o=- A macska belépett a kamrába.
ha [[ $ str= ~[cbr]nál nél]];azután
kidobtamegtalált
lenni

A [cbr] at minta illeszkedik a macskához, amely „c” betűvel kezdődik, és folytatódik és at -vel végződik. [cbr] at azt jelenti, hogy egyezzen a „c” vagy a „b” vagy az „r” karakterrel, majd at.

A következő kód kimenete található, azaz egyezés történt:

o=- A denevér bejött a kamrába.
ha [[ $ str= ~[cbr]nál nél]];azután
kidobtamegtalált
lenni

A [cbr] at minta illeszkedik a denevérhez, amely „b” betűvel kezdődik, és folytatódik és at -vel végződik. [cbr] at azt jelenti, hogy egyezzen a „c” vagy a „b” vagy az „r” karakterrel, majd at.

A következő kód kimenete található, azaz egyezés történt:

o=- A patkány bejött a kamrába.
ha [[ $ str= ~[cbr]nál nél]];azután
kidobtamegtalált
lenni

A [cbr] at minta illeszkedik a patkányhoz, amely „r” betűvel kezdődik, és folytatódik és at -val végződik.

A fenti kódmintákban a programozó nem tudja, hogy macska, denevér vagy patkány létezik -e a cél stringben. De tudja, hogy az allánc vagy „c”, „b” vagy „r” betűvel kezdődik, majd folytatódik és at -val végződik. A mintában lévő szögletes zárójelek lehetővé teszik, hogy a különböző lehetséges karakterek illeszkedjenek egy karakterhez a célhoz képest. Tehát a szögletes zárójelek egy sor karaktert tartalmaznak, amelyek közül egyet illesztenek egy allánchoz. Végül a teljes allánc illeszkedik.

Karakterek köre

A fenti kódban a [cbr] egy osztály. Még akkor is, ha a „c”, „b” vagy „r” egyetlen karakternek felel meg, ha ezután azonnal nem egyezik, a minta nem fog megfelelni.

Nos, vannak bizonyos tartományok, amelyek egy osztályt alkotnak. Például 0–9 számjegy alkotja az osztályt, [0–9], 0 és 9 számmal együtt. A kisbetűs „a”-„z” az [a – z] osztályt alkotja, az „a” és „z” jelzéssel együtt. Az „A” és „Z” közötti nagybetűk az [A – Z] osztályt alkotják, az „A” és a „Z” jelzéssel együtt. Egy osztályból az egyik olyan karakter, amely megfelelne a karakterlánc egyik karakterének.

A következő kód egyezést eredményez:

ha [[ 'ID8id'= ~[0-9] ]];azután
kidobtamegtalált
lenni

Ezúttal a cél egy literális karakterlánc az állapotban. A 8, amely a tartományon belüli lehetséges számok egyike, [0-9], az „ID8id” karakterlánc 8-as illeszkedése. A fenti kód egyenértékű:

ha [[ 'ID8id'= ~[0123456789] ]];azután
kidobtamegtalált
lenni

Itt az összes lehetséges számot a mintába írták, így nincs kötőjel.

A következő kódban egyezést kapunk:

ha [[ 'ID8iD'= ~[a-z] ]];azután
kidobtamegtalált
lenni

Az egyezés a tartomány kis „i”, [a – z] és az „ID8iD” cémsor „i” között van.

Ne feledje: a tartomány egy osztály. Az osztály része lehet egy nagyobb mintának. Tehát egy mintában szöveg lehet az óra előtt és/vagy után. A következő kód ezt szemlélteti:

ha [[ 'Az ID8id az azonosító'= ~ Azonosító[0-9]id ]];azután
kidobtamegtalált
lenni

A kimenet: megtalálható. A minta „ID8id” illeszkedik az „ID8id” értékhez a cél karakterláncban.

Tagadás

Az egyezés nem érhető el a következő kódból:

ha [[ '0123456789101112'= ~[^0-9] ]];azután
kidobtamegtalált
más
kidobtanem található
lenni

A kimenet:

nem található

Ha nincs ^ a tartomány előtt, a szögletes zárójelben, a tartomány nulla illeszkedett volna a céltárgy első nullájához. Tehát ^ egy tartomány (vagy választható karakterek) előtt tagadja az osztályt.

A következő kód egyezést eredményez, mert a feltétel a következő: egyezik a nem számjegyű karakterrel a cél bármely pontján:

ha [[ 'ABCDEFGHIJ'= ~[^0-9] ]];azután
kidobtamegtalált
más
kidobtanem található
lenni

Tehát a kimenet: talált.

[^0-9] nem számjegyet jelent, tehát [^0-9] a [0-9] tagadása.

[^a-z] nem kisbetűt jelent, tehát [^a-z] az [a-z] tagadása.

[^A-Z] nem nagybetűs betűt jelent, tehát [^A-Z] az [A-Z] tagadása.

Más tagadások is rendelkezésre állnak.

A periódus (.) A mintában

A mintában lévő pont (.) Megfelel bármely karakternek, beleértve önmagát is. Vegye figyelembe a következő kódot:

ha [[ '6759WXY.A3'= ~ 7.9W.Y.A]];azután
kidobtamegtalált
lenni

A kód kimenete megtalálható, mert a többi karakter megegyezik. Egy pont megfelel az „5” -nek; egy másik pont megfelel az „X” -nek; és az utolsó pont egy pontnak felel meg.

Megfelelő váltakozás

Tekintsük ezt a mondatot egy célstringen:

A ketrecben különböző típusú madarak vannak.

Valaki szeretné tudni, hogy van -e galambja, páva vagy sas. A következő kód használható:

o=- A ketrecben különböző típusú pávák vannak.
ha [[ $ str= ~ galamb|páva|sas]];azután
kidobtamegtalált
más
kidobtanem található
lenni

A kimenet megtalálható. Az alternatív metakarakter, | foglalkoztattak. Lehet két, három, négy és több alternatíva. Ami ebben a kódban megegyezik, az a „páva”.

Csoportosítás

A következő mintában zárójeleket használtunk a karakterek csoportosítására:

színpad (táncos)

A csoport itt egy színpadi táncos, körülötte a metakarakterek (és). (táncos) egy alcsoport, míg egy színpad (táncos) az egész csoport. Tekintsük a következő:

A (táncos fantasztikus)

Itt az alcsoport vagy alstringen a táncos fantasztikus.

Alhúrok közös részekkel

Az érintett az a személy, aki érdekelt egy vállalkozásban. Képzeljünk el egy vállalkozást, amelynek webhelye van, a wage.com. Képzelje el, hogy a következő célkarakterláncok egyike található a számítógépben:

A webhely, a svar.com az üzletnek való .;

Ott van az érintett.;

Az érdekelt fél a svar.com -nak dolgozik .;

Legyen bármelyik karakterlánc a célpont. A programozó tudni szeretné, hogy a tét.com vagy az érdekelt fél szerepel -e bármilyen célstringen. A mintája a következő lenne:

tét.com | érdekelt fél

váltakozást használva.

a tétet kétszer írták be a két szóba. Ez elkerülhető, ha a mintát a következőképpen írja be:

tét (.com | tulajdonos)

.com | tulajdonos ebben az esetben az alcsoport.

Megjegyzés: az alternatív karakter használata ebben az esetben. továbbra is keresést végeznek a A következő kód kimenete található:

o='A webhely, a svar.com az üzletnek való.'
ha [[ $ str= ~ tét(.val vel|tartó) ]];azután
kidobtamegtalált
lenni

Az itt illeszkedő allánc a kaal.com.

A BASH_REMATCH előre definiált tömb

A BASH_REMATCH egy előre definiált tömb. Tegyük fel, hogy egy mintának vannak csoportjai. Az egész csoport megfelelt, belép a tömb 0. indexének cellájába. Az első alcsoport megfelelt, az 1. index cellájába megy; a második alcsoport megfelelt, a 2. index cellájába megy, és így tovább. A következő kód bemutatja, hogyan kell használni ezt a tömböt:

o=- Megjött a színpadi táncos.
ha [[ $ str= ~ szakasz (táncos) ]];azután
kidobtamegtalált
lenni

számáraénban ben $ {! BASH_REMATCH [@]};tedd
printf '$ {BASH_REMATCH [i]}, '
Kész
kidobta

A kimenet:

megtalált
színpadi táncos, táncos,

Az egész csoport színpadi táncos. Csak egy alcsoport van, amely táncos.

Megjegyzés: a minta szóköze megszűnt.

Felső/kisbetűs függetlenségi egyezés

A megfeleltetés, amint azt a fentiekben kifejtettük, megkülönbözteti a kis- és nagybetűket. Az illesztés az esettől függetlenül elvégezhető. Ezt szemlélteti a következő kód:

üzletek -snocasematch

o='Szeretjük a jó zenét.'
ha [[ $ str= ~ GoOd]];azután
kidobtamegtalált
lenni

üzletek -unocasematch

A kimenet: megtalálható. A minta GoOd. A megfelelő karakterlánc „jó”. Jegyezze meg, hogy a nocasematch opciót a kódszegmens elején engedélyezték, és a kódszegmens végén letiltották.

Egy húr hossza

A karakterlánc hossza szintaxisa a következő:

$ {#PARAMETER}

Példa:

o='Szeretjük a jó zenét.'
kidobta $ {# str}

A kimenet: 19.

String Reduction

A karakterlánc -csökkentés szintaxisa a következő:

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

ahol az eltolás számlálása nulláról indul.

A következő példa bemutatja, hogyan lehet eltávolítani a karakterlánc első 11 karakterét:

o='Mindig jó zenére táncolok.'
kidobta $ {str: 10}

A kimenet:

jó zene.

A LENGTH számítása a következő karaktertől kezdődik. A következő kód megmutatja, hogyan lehet megengedni a karakterlánc egy részét:

o='Mindig jó zenére táncolok.'
kidobta $ {str: 10: 6}

A kimenet:

ance t

Az első 11 karaktert eltávolítottuk; a következő 6 karakter megengedett, a többi karakter pedig automatikusan eltávolításra került.

Keresés és csere

Ha egy alláncot talál, azt le lehet cserélni egy másik karakterlánccal. Ennek szintaxisa a következő:

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

Az első szintaxishoz egyetlen előrejelzéssel csak az első egyezést kell kicserélni. Példa:

o=- Egy patkány, egy denevér és egy macska van a kamrában.
jobb=$ {str/[cbr] at/big cow}
kidobta $ str
kidobta $ ret

A kimenet:

A kamrában van egy patkány, egy denevér és egy macska.
A kamrában van egy nagy tehén, egy denevér és egy macska.

A második szintaxishoz kettős előrevágásokkal a mérkőzés minden előfordulása lecserélődik. Példa:

o=- Egy patkány, egy denevér és egy macska van a kamrában.
jobb=$ {str // [cbr] at/big cow}
kidobta $ str
kidobta $ ret

A kimenet:

A kamrában van egy patkány, egy denevér és egy macska.
A kamrában van egy nagy tehén, egy nagy tehén és egy nagy tehén.

A harmadik szintaxishoz egyetlen előrejelzéssel nem lehet helyettesíteni az első és egyetlen mérkőzést.

Ezenkívül az első talált karakterlánc törlődik. Példa:

o=- Egy patkány, egy denevér és egy macska van a kamrában.
jobb=$ {str/[cbr] itt:}
kidobta $ str
kidobta $ ret

A negyedik szintaxis kettős előrevágással nem helyettesíti az összes mérkőzést. Ezenkívül minden talált allánc törlődik. Példa:

o=- Egy patkány, egy denevér és egy macska van a kamrában.
jobb=$ {str // [cbr] itt}
kidobta $ str
kidobta $ ret

A kimenet:

A kamrában van egy patkány, egy denevér és egy macska.
A kamrában van a, a és a.

Következtetés

Annak ellenőrzéséhez, hogy egy karakterlánc tartalmaz -e alstringet a Bash -ben, a Mintaegyezést kell használni. A mintaegyezés nem csak a kettős zárójelben, [[. . . ]]. Ez a paraméterbővítésben is megtörténhet, $ {. . .}. A paraméterbővítéssel lehetőség van indexek szerinti alstringet szerezni.

A cikkben bemutatottak a mintaegyezés legkritikusabb pontjai. Több is van! Azonban az olvasónak ezt kell tanulmányoznia, a Fájlnév kibővítése.