Kako preveriti, ali niz vsebuje podniz v bashu

How Check If String Contains Substring Bash



Vprašanje je, kako preveriti, ali niz vsebuje podniz v Bashu. Odgovor je: uporabite ujemanje vzorcev. To odpira drugo vprašanje, in sicer: kaj je ujemanje vzorcev? No, stavek v stavku ima določene lastnosti. Zato se razlikuje od drugih stavkov v istem stavku ali v drugih stavkih. Značilnosti je mogoče kodirati kot vzorec. Na ta način je mogoče identificirati določeno frazo v nizu. Ta članek pojasnjuje, kako identificirati določen podniz v večjem nizu, zamenjati podniz z drugim podnizom in poiskati kateri koli podniz v večjem nizu po indeksu. Preden se poglobimo v razlage, se moramo spomniti različnih načinov, kako je niz nastavljen v Bashu.

Niz z izogibanjem presledkom

Niz je mogoče sestaviti tako, da vsak presledek nadomestimo z zaporedjem presledkov, '; kot v:







myVar= Turizem v Egipt je ena od države 's vodilne ekonomske industrije.
vrgel ven $ myVar

Izhod je:



Turizem v Egiptu je ena vodilnih gospodarskih panog v državi.



Opomba: apostrof je uporabil tudi zaporedje pobega v vesolje.





Niz po enojnih narekovajih

Ali ima programer čas, da pobegne iz vseh presledkov v nizu? Ne. Zato je bolje uporabiti dve enojni narekovaji za razmejitev niza; kot naprimer:

myVar='Turizem v Egiptu je ena od držav' ''vodilne gospodarske panoge.'

Niz z enim navedom ne dovoljuje razširitve (zamenjave z učinkom) katerega koli zaporedja izhodov. Na srečo, če sta dva niza kodirana drug poleg drugega, bosta vzeta kot en niz. Vmes lahko vstavite zaporedno zaporedje, kot je opisano zgoraj. Zaporedje izhodov bi se razširilo. Torej rezultat postane:



Turizem v Egiptu je ena vodilnih gospodarskih panog v državi.

Niz po dvojnih narekovajih

Z dvojnimi narekovaji se tudi zaporedja za izhod ne razširijo, ampak se spremenljivke razširijo. Naslednja koda ponazarja to:

myVar= Turizem v Egipt je ena od države 's vodilne ekonomske industrije.
vrgel ven $ myVar

Izhod je:

Turizem v Egiptu je ena vodilnih gospodarskih panog v državi.

Opomba: apostrof je uporabil tudi zaporedje pobega v vesolje.

V tem članku je glavna vrsta niza v enojnih narekovajih.

Osnove rednega izražanja

Regex

Razmislite o tem nizu:

Ta svet v resnici ni naš dom.

Naj bo svet podniz zanimanja. Nato se veliki niz (cel niz) imenuje ciljni niz ali preprosto cilj. 'Svet' v narekovajih se imenuje regularni izraz ali preprosto regex. V tem primeru je vzorec vsebina, svet.

Enostavno ujemanje

V naslednji kodi, če beseda 'svet' najdemo v tarči, bi rekli, da se beseda ujema.

str='Ta svet v resnici ni naš dom.'
reg='svet'
če [[ $ str= ~$ reg ]];potem
vrgel vennajdeno
drugače
vrgel venni najdeno
biti

= ~, ki je operator dodelitve, ki mu sledi ~, se imenuje operater vezave. Pogoj preveri, ali se vzorec ujema s ciljnim nizom. Če se v cilju najde podniz, ki ustreza vzorcu, se v stavku echo prikaže najdeno. Če ga ne najdete, odmev echo ne najde. Izhod za to kodo je:

najdeno

Ker se vzorec, svet, nahaja v tarči. Upoštevajte, da je razmik med [[in prej]] ohranjen.

Vzorec

V zgornji kodi je 'svet' v narekovajih regex, svet sam pa vzorec. To je preprost vzorec. Vendar večina vzorcev ni tako preprosta. Vzorec je karakterizacija podniz, ki ga je treba najti. Tako vzorec Bash uporablja določene metaznake. Metaznak je lik o drugih likih. Na primer, Bash Pattern uporablja naslednje metaznake:

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

Regularni izraz lahko vnesete tudi v dvojne oklepaje. Ni pa nujno, da je v narekovajih. Torej je v tem primeru dobesedno vzorec.

Razredi znakov

Oglati oklepaji

Najde se izhod te kode, kar pomeni, da je prišlo do ujemanja:

str='Mačka je prišla v komoro.'
če [[ $ str= ~[cbr]ob]];potem
vrgel vennajdeno
biti

Vzorec [cbr] at se ujema z mačko, ki se začne z 'c' in se nadaljuje in konča z. [cbr] pri pomeni, se ujema z „c“ ali „b“ ali „r“, ki mu sledi at.

Najde se izhod te kode, kar pomeni, da je prišlo do ujemanja:

str='Netopir je prišel v komoro.'
če [[ $ str= ~[cbr]ob]];potem
vrgel vennajdeno
biti

Vzorec [cbr] at se ujema z bat, ki se začne z 'b' in ki se nadaljuje in konča pri. [cbr] pri pomeni, se ujema z „c“ ali „b“ ali „r“, ki mu sledi at.

Najde se izhod te kode, kar pomeni, da je prišlo do ujemanja:

str='Podgana je prišla v komoro.'
če [[ $ str= ~[cbr]ob]];potem
vrgel vennajdeno
biti

Vzorec [cbr] at se ujema s podgano, ki se začne z „r“ in se nadaljuje in konča z.

V zgornjih vzorcih kod programer ne ve, ali v ciljnem nizu obstaja mačka, netopir ali podgana. Ve pa, da se podniz začne na 'c' ali 'b' ali 'r', nato se nadaljuje in konča na na. Kvadratni oklepaji v vzorcu omogočajo, da se različni možni znaki ujemajo z enim znakom na položaju v primerjavi z drugimi v tarči. V oglatih oklepajih je torej nabor znakov, od katerih se eden ujema za podniz. Končno se ujema celoten podniz.

Obseg znakov

V zgornji kodi je [cbr] razred. Tudi če 'c' ali 'b' ali 'r' ustreza enemu znaku, če se nato takoj ne ujema, se vzorec ne ujema z ničemer.

No, obstajajo določeni razponi, ki bodo tvorili razred. Na primer, razred od 0 do 9 števk, [0-9] z vključenimi 0 in 9. Male črke od „a“ do „z“ tvorijo razred [a-z] z vključenima „a“ in „z“. Velike črke od 'A' do 'Z' tvorijo razred [A-Z] z vključenima 'A' in 'Z'. Iz razreda je eden od znakov, ki bi se ujemali z enim znakom v nizu.

Naslednja koda ustvari ujemanje:

če [[ 'ID8id'= ~[0-9] ]];potem
vrgel vennajdeno
biti

Tokrat je cilj dobesedni niz v pogoju. 8, ki je ena od možnih številk v območju, [0-9], se ujema z 8 v nizu, 'ID8id'. Zgornja koda je enakovredna:

če [[ 'ID8id'= ~[0123456789] ]];potem
vrgel vennajdeno
biti

Tu so bile v vzorec zapisane vse možne številke, zato vezaja ni.

V naslednji kodi dobimo ujemanje:

če [[ 'ID8iD'= ~[a-z] ]];potem
vrgel vennajdeno
biti

Ujemanje je med malimi črkami 'i' obsega, [a-z] in malimi 'i' ciljnega niza 'ID8iD'.

Ne pozabite: obseg je razred. Razred je lahko del večjega vzorca. Tako je lahko v vzorcu besedilo pred in/ali po razredu. Naslednja koda ponazarja to:

če [[ 'ID8id je identifikator'= ~ ID[0-9]id ]];potem
vrgel vennajdeno
biti

Izhod je: Najdeno. 'ID8id' iz vzorca se ujema z 'ID8id' v ciljnem nizu.

Negacija

Ujemanje ni pridobljeno iz naslednje kode:

če [[ '0123456789101112'= ~[^0-9] ]];potem
vrgel vennajdeno
drugače
vrgel venni najdeno
biti

Izhod je:

ni najdeno

Brez ^ pred obsegom, v oglatih oklepajih, bi se nič območja ujemalo s prvo ničlo ciljnega niza. Torej ^ pred obsegom (ali neobveznimi znaki) zanika razred.

Naslednja koda ustvari ujemanje, ker se pogoj glasi: ujema se s katerim koli nemestnim znakom kjer koli v cilju:

če [[ 'ABCDEFGHIJ'= ~[^0-9] ]];potem
vrgel vennajdeno
drugače
vrgel venni najdeno
biti

Torej je izhod: Najdeno.

[^0-9] pomeni nemestno številko, zato je [^0-9] negacija [0-9].

[^a-z] pomeni črko, ki ni mala, zato je [^a-z] negacija [a-z].

[^A-Z] pomeni črko, ki ni velika, zato je [^A-Z] negacija [A-Z].

Na voljo so tudi druge negacije.

Obdobje (.) V vzorcu

Točka (.) V vzorcu se ujema s katerim koli znakom, vključno s samim seboj. Upoštevajte naslednjo kodo:

če [[ '6759WXY.A3'= ~ 7,9 W.Y.A]];potem
vrgel vennajdeno
biti

Izhod kode je najden, ker se drugi znaki ujemajo. Ena pika ustreza '5'; druga pika ustreza 'X'; zadnja pika pa se ujema s piko.

Ujemanje alternacije

Za ciljni niz razmislite o tem stavku:

V kletki so ptice različnih vrst.

Nekdo bo morda želel vedeti, ali ima ta tarča golob, pav ali orel. Uporabite lahko naslednjo kodo:

str='V kletki so pavi različnih vrst.'
če [[ $ str= ~ golob|pav|orel]];potem
vrgel vennajdeno
drugače
vrgel venni najdeno
biti

Izhod je, najden. Nadomestni znak, | je bil zaposlen. Možnosti so lahko dve, tri, štiri in več. V tej kodi se ujema „pav“.

Združevanje

V naslednjem vzorcu so bili oklepaji uporabljeni za združevanje znakov:

oder (plesalec)

Skupina je odrski plesalec, obkrožen z metaznaki (in). (plesalka) je podskupina, oder (plesalka) pa celotna skupina. Upoštevajte naslednje:

(Plesalka je odlična)

Tu je podskupina ali podniz, plesalka je super.

Podniz s skupnimi deli

Zainteresirana oseba je oseba, ki jo zanima podjetje. Predstavljajte si podjetje s spletno stranjo ,.com. Predstavljajte si, da je v računalniku eden od naslednjih ciljnih nizov:

Spletno mesto ,.com.com je za podjetja .;

Obstaja deležnik .;

Zainteresirana stran dela za delež.com;

Naj bo kateri od teh nizov tarča. Programer bo morda želel vedeti, ali je delež.com ali deležnik v katerem koli ciljnem nizu. Njegov vzorec bi bil:

delež.com | deležnik

z uporabo izmeničnosti.

stavek je bil v dveh besedah ​​vnesen dvakrat. Temu se lahko izognemo tako, da vzorec vnesemo na naslednji način:

delež (.com | imetnik)

.com | v tem primeru je podskupina.

Opomba: uporaba nadomestnega znaka v tem primeru. delež.com ali deležnik bo še vedno iskan. Najde se izhod naslednje kode:

str='Spletno mesto ,.com.com je za podjetja.'
če [[ $ str= ~ stavek(.s|držalo) ]];potem
vrgel vennajdeno
biti

Podvrst, ki se tukaj ujema, je stake.com.

Vnaprej določen niz BASH_REMATCH

BASH_REMATCH je vnaprej določena matrika. Predpostavimo, da ima vzorec skupine. Celotna skupina se ujema, gre v celico za indeks 0 tega niza. Prva podskupina se ujema, gre v celico za indeks 1; druga podskupina se ujema, gre v celico za indeks 2 itd. Naslednja koda prikazuje, kako uporabljati to matriko:

str='Prišel je odrski plesalec.'
če [[ $ str= ~ stopnja (plesalka) ]];potem
vrgel vennajdeno
biti

zajazv $ {! BASH_REMATCH [@]};naredi
printf '$ {BASH_REMATCH [i]}, '
Končano
vrgel ven

Izhod je:

najdeno
odrski plesalec, plesalec,

Celotna skupina je odrska plesalka. Obstaja samo ena podskupina, in sicer plesalka.

Opomba: prostor v vzorcu je umaknjen.

Ujemanje neodvisnosti velikih/malih črk

Ujemanje, kot je razloženo zgoraj, razlikuje velike in male črke. Ujemanje se lahko izvede neodvisno od primera. To je prikazano v naslednji kodi:

trgovine -snocasematch

str='Radi imamo dobro glasbo.'
če [[ $ str= ~ Dobro]];potem
vrgel vennajdeno
biti

trgovine -unocasematch

Izhod je: Najdeno. Vzorec je, GoOd. Podvrst, ki se ujema, je 'dobra'. Upoštevajte, kako je bila možnost nocasematch omogočena na začetku odseka kode in onemogočena na koncu odseka kode.

Dolžina niza

Sintaksa za pridobitev dolžine niza je:

$ {#PARAMETER}

Primer:

str='Radi imamo dobro glasbo.'
vrgel ven $ {# str}

Izhod je: 19.

Zmanjšanje nizov

Sintakse za zmanjšanje nizov so:

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

kjer se štetje za OFFSET začne od nič.

Naslednji primer prikazuje, kako odstraniti prvih 11 znakov niza:

str='Vedno plešem ob dobri glasbi.'
vrgel ven $ {str: 10}

Izhod je:

za dobro glasbo.

Štetje za LENGTH se začne od naslednjega znaka. Naslednja koda prikazuje, kako je dovoljen del v nizu:

str='Vedno plešem ob dobri glasbi.'
vrgel ven $ {str: 10: 6}

Izhod je:

ance t

Prvih 11 znakov je bilo odstranjenih; naslednjih 6 znakov je bilo dovoljenih, preostali znaki pa so bili samodejno odstranjeni.

Išči in zamenjaj

Ko najdemo podniz, ga lahko zamenjamo z drugim. Za to so skladnje:

kje=$ {PARAMETER/PATERN/REPLACEMENT}
kje=$ {PARAMETER // VZOREC/ZAMENJAVA}
kje=$ {PARAMETER/PATTERN}
kje=$ {PARAMETER // VZOREC}

Za prvo skladnjo z eno samo poševnico naprej se zamenja samo prvo ujemanje. Primer:

str='V komori so podgana, netopir in mačka.'
prav=$ {str/[cbr] pri/velika krava}
vrgel ven $ str
vrgel ven $ ret

Izhod je:

V komori so podgana, netopir in mačka.
V komori je velika krava, netopir in mačka.

Pri drugi skladnji z dvojnimi poševnicami naprej se zamenjajo vsi pojavi ujemanja. Primer:

str='V komori so podgana, netopir in mačka.'
prav=$ {str // [cbr] pri/velika krava}
vrgel ven $ str
vrgel ven $ ret

Izhod je:

V komori so podgana, netopir in mačka.
V komori je velika krava, velika krava in velika krava.

Za tretjo skladnjo z eno samo poševnico naprej ni zamenjave za prvo in edino ujemanje.

Izbrisan je tudi prvi najdeni podniz. Primer:

str='V komori so podgana, netopir in mačka.'
prav=$ {str/[cbr] pri}
vrgel ven $ str
vrgel ven $ ret

Za četrto skladnjo z dvojnimi poševnicami naprej ni nadomestkov za vsa ujemanja. Prav tako se izbrišejo vsi najdeni podniz. Primer:

str='V komori so podgana, netopir in mačka.'
prav=$ {str // [cbr] pri}
vrgel ven $ str
vrgel ven $ ret

Izhod je:

V komori so podgana, netopir in mačka.
V komori sta a, a in a.

Zaključek

Če želite preveriti, ali ima niz podniz v bashu, je treba uporabiti ujemanje vzorcev. Ujemanje vzorcev ne poteka samo v dvojnih oklepajih, [[. . . ]]. Lahko se zgodi tudi pri razširitvi parametrov s svojimi $ {. . .}. Z razširitvijo parametrov je mogoče pridobiti podniz z indeksi.

Kar je bilo predstavljeno v tem članku, so najbolj kritične točke pri ujemanju vzorcev. Več jih je! Naslednjič pa bi moral bralec preučiti razširitev imena datoteke.