Kako provjeriti sadrži li niz podnaslov u bashu

How Check If String Contains Substring Bash



Pitanje je, kako provjeriti sadrži li niz podniz u Bash -u. Odgovor je: upotrijebite Pattern Matching. To dovodi do još jednog pitanja, a to je: što je Uzorkovanje? Pa, izraz u rečenici ima određene karakteristike. Zato se razlikuje od drugih fraza u istoj rečenici ili u drugim rečenicama. Karakteristike se mogu kodirati kao uzorak. Na taj se način može identificirati određena fraza u nizu. Ovaj članak objašnjava kako identificirati određeni podniz u većem nizu, zamijeniti podniz usklađen s drugim podnizom i locirati bilo koji podniz u većem nizu prema indeksu. Međutim, prije nego što zađemo u objašnjenja, moramo se prisjetiti različitih načina na koji se niz uspostavlja u Bashu.

String by Escaping Spaces

Niz se može konstruirati zamjenom svakog prostora razmakom za izbjegavanje razmaka, ''; kao u:







myVar= Turizam u Egipat je jedna od zemlje 's vodeće ekonomske industrije.
izbaciti $ myVar

Izlaz je:



Turizam u Egiptu jedna je od vodećih privrednih grana zemlje.



Napomena: apostrof je također koristio razmaknicu.





String by Single Quotes

Ima li programer vremena za izbjegavanje svih razmaka u nizu? Ne. Stoga je bolje koristiti dva pojedinačna navodnika za razgraničenje niza; kao što su:

myVar='Turizam u Egiptu jedna je od zemalja' 'vodeće gospodarske industrije. '

Niz s jednim navodnikom ne dopušta proširenje (zamjenu sa svojim učinkom) bilo koje eskadrirajuće sekvence. Srećom, ako su dva niza kodirana jedan do drugog, bit će uzeti kao jedan niz. Izbjegavajući niz može se umetnuti između, kao što je gore učinjeno. Bijeg bi se proširio. Tako izlaz postaje:



Turizam u Egiptu jedna je od vodećih privrednih grana zemlje.

String by Double Quotes

Dvostrukim navodnicima se ni eskapcijske sekvence ne proširuju, već se proširuju varijable. Sljedeći kod to ilustrira:

myVar= Turizam u Egipat je jedna od zemlje 's vodeće ekonomske industrije.
izbaciti $ myVar

Izlaz je:

Turizam u Egiptu jedna je od vodećih privrednih grana zemlje.

Napomena: apostrof je također koristio razmaknicu.

U ovom članku glavna vrsta niza koji se razmatra je niz u jednostrukim navodnicima.

Osnove regularnog izražavanja

Regularni izraz

Razmotrite ovaj niz:

Ovaj svijet zapravo nije naš dom.

Neka svijet bude podniz interesa. Zatim se veliki niz (cijeli niz) naziva ciljnim nizom ili jednostavno, metom. ‘Svijet’ u navodnicima naziva se regularni izraz ili jednostavno regex. Sadržaj, svijet, u ovom je slučaju uzorak.

Jednostavno podudaranje

U sljedećem kodu, ako se riječ 'svijet' nađe u meti, rekli bismo da se riječ podudara.

str='Ovaj svijet zapravo nije naš dom.'
reg='svijet'
ako [[ $ str= ~$ reg ]];zatim
izbacitipronađeno
drugo
izbacitinije pronađeno
biti

= ~, koji je operator dodjeljivanja iza kojeg slijedi ~, naziva se operator vezanja. Uvjet provjerava je li uzorak usklađen u ciljnom nizu. Ako se u cilju nađe podniz koji odgovara uzorku, naredba echo prikazuje pronađeno. Ako nije pronađena, naredba echo eho nije pronađena. Izlaz za ovaj kôd je:

pronađeno

Kako se uzorak, svijet, nalazi u meti. Imajte na umu da je razmak između [[i prije]] zadržan.

Uzorak

U gornjem kodu, 'svijet' u navodnicima je regex, dok je sam svijet uzorak. Ovo je jasan obrazac. Međutim, većina uzoraka nije tako jednostavna. Uzorak je karakterizacija podniza koji se mora pronaći. Dakle, Bash uzorak koristi određene metaznakove. Metakarakter je lik o drugim likovima. Na primjer, Bash Pattern koristi sljedeće metaznakove:

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

Regularni izraz također se može upisati u dvostruke zagrade uvjeta. Ali ne mora biti pod navodnicima. Dakle, u ovom slučaju to je doslovno uzorak.

Klase likova

Uglate zagrade

Pronađen je izlaz sljedećeg koda, što znači da se dogodilo podudaranje:

str='Mačka je ušla u odaju.'
ako [[ $ str= ~[kbr]na]];zatim
izbacitipronađeno
biti

Uzorak, [cbr] at ima usklađenu mačku, koja počinje s 'c', a nastavlja se i završava s. [cbr] u znači, podudarajte se sa 'c' ili 'b' ili 'r', nakon čega slijedi at.

Pronađen je izlaz sljedećeg koda, što znači da se dogodilo podudaranje:

str='Šišmiš je ušao u odaju.'
ako [[ $ str= ~[kbr]na]];zatim
izbacitipronađeno
biti

Uzorak, [cbr] at ima usklađeni šišmiš, koji počinje s 'b', a nastavlja se i završava s. [cbr] u znači, podudarajte se sa 'c' ili 'b' ili 'r', nakon čega slijedi at.

Pronađen je izlaz sljedećeg koda, što znači da se dogodilo podudaranje:

str='Štakor je ušao u odaju.'
ako [[ $ str= ~[kbr]na]];zatim
izbacitipronađeno
biti

Uzorak, [cbr] at ima usklađenog štakora, koji počinje s 'r', a nastavlja se i završava s.

U gornjim uzorcima koda, programer ne zna postoje li mačka, šišmiš ili štakor u ciljnom nizu. No, on zna da podniz počinje s 'c' ili 'b' ili 'r', zatim se nastavlja i završava s. Uglate zagrade u uzorku dopuštaju različitim mogućim znakovima podudaranje jednog znaka na položaju u odnosu na druge u meti. Dakle, uglate zagrade sadrže skup znakova, od kojih se jedan podudara za podniz. Konačno, to je potpuni podniz koji se podudara.

Raspon likova

U gornjem kodu [cbr] je klasa. Čak i ako 'c' ili 'b' ili 'r' odgovara jednom znaku, ako se nakon toga odmah ne podudara, uzorak neće ništa odgovarati.

Pa, postoje određeni rasponi koji će činiti klasu. Na primjer, 0 do 9 znamenki čine klasu, [0-9] s uključenim 0 i 9. Mala slova 'a' do 'z' tvore klasu [a-z] s uključenim 'a' i 'z'. Velika slova 'A' do 'Z' tvore klasu [A-Z] s uključenim 'A' i 'Z'. Iz klase je to jedan od znakova koji bi odgovarao jednom znaku u nizu.

Sljedeći kôd proizvodi podudaranje:

ako [[ 'ID8id'= ~[0-9] ]];zatim
izbacitipronađeno
biti

Ovaj put cilj je doslovni niz u stanju. 8, koji je jedan od mogućih brojeva unutar raspona, [0-9], podudara se s 8 u nizu, 'ID8id'. Gornji kôd ekvivalentan je:

ako [[ 'ID8id'= ~[0123456789] ]];zatim
izbacitipronađeno
biti

Ovdje su svi mogući brojevi zapisani u uzorku, tako da nema crtice.

U sljedećem kodu dobiveno je podudaranje:

ako [[ 'ID8iD'= ~[a-z] ]];zatim
izbacitipronađeno
biti

Podudaranje je između malih 'i' raspona, [a-z] i malih 'i' ciljnog niza, 'ID8iD'.

Upamtite: raspon je klasa. Klasa može biti dio većeg uzorka. Dakle, u uzorku, tekst može biti ispred i/ili poslije nastave. Sljedeći kod to ilustrira:

ako [[ 'ID8id je identifikator'= ~ ID[0-9]iskaznica ]];zatim
izbacitipronađeno
biti

Izlaz je: pronađen. 'ID8id' iz uzorka podudara se s 'ID8id' u ciljnom nizu.

Negacija

Podudaranje se ne dobiva iz sljedećeg koda:

ako [[ '0123456789101112'= ~[^0-9] ]];zatim
izbacitipronađeno
drugo
izbacitinije pronađeno
biti

Izlaz je:

nije pronađeno

Bez ^ ispred raspona, unutar uglatih zagrada, nula raspona odgovarala bi prvoj nuli ciljnog niza. Dakle, ^ ispred raspona (ili izbornih znakova) negira klasu.

Sljedeći kôd proizvodi podudaranje jer uvjet glasi: podudarajte se s bilo kojim znamenkovitim znakom bilo gdje u cilju:

ako [[ 'ABCDEFGHIJ'= ~[^0-9] ]];zatim
izbacitipronađeno
drugo
izbacitinije pronađeno
biti

Dakle izlaz je: found.

[^0-9] znači necifreno, pa je [^0-9] negacija [0-9].

[^a-z] znači malo slovo, pa je [^a-z] negacija [a-z].

[^A-Z] znači veliko slovo, pa je [^A-Z] negacija [A-Z].

Dostupne su i druge negacije.

Razdoblje (.) U uzorku

Točka (.) U uzorku odgovara bilo kojem znaku, uključujući i njega samog. Uzmite u obzir sljedeći kod:

ako [[ '6759WXY.A3'= ~ 7,9 W.Y.A]];zatim
izbacitipronađeno
biti

Izlaz koda je pronađen jer se drugi znakovi podudaraju. Jedna točka odgovara '5'; druga točka odgovara 'X'; a posljednja točka odgovara točki.

Podudaranje alternacije

Uzmite u obzir ovu rečenicu za ciljani niz:

U kavezu su ptice različitih vrsta.

Netko će možda htjeti znati ima li ova meta goluba, pauna ili orla. Može se koristiti sljedeći kod:

str='U kavezu su paunovi različitih vrsta.'
ako [[ $ str= ~ golub|paun|orao]];zatim
izbacitipronađeno
drugo
izbacitinije pronađeno
biti

Izlaz je, pronađen. Metaznak izmjene, | je zaposlen. Mogu postojati dvije, tri, četiri i više alternativa. Ono što se podudara u ovom kodu je 'paun'.

Grupiranje

U sljedećem uzorku zagrade su korištene za grupiranje znakova:

pozornica (plesač)

Ovdje je grupa scenski plesač okružena metakarakterima (i). (plesač) je podskupina, dok je pozornica (plesač) cijela skupina. Uzmite u obzir sljedeće:

(Plesačica je odlična)

Ovdje je podgrupa ili podniz, plesač je super.

Podniz sa zajedničkim dijelovima

Dionik je osoba koja ima interes u poslu. Zamislite posao s web mjestom, udio.com. Zamislite da se jedan od sljedećih ciljnih nizova nalazi u računalu:

Web stranica, udio.com je za poslovne namjene .;

Tu je dionik .;

Dionica radi za stake.com .;

Neka bilo koji od ovih nizova bude meta. Programer će možda htjeti znati je li udjel.com ili dionik u bilo kojem ciljnom nizu. Njegov uzorak bi bio:

udio.com | dionik

koristeći izmjenu.

ulog je dva puta upisan u dvije riječi. To se može izbjeći upisivanjem uzorka na sljedeći način:

ulog (.com | držač)

.com | owner je u ovom slučaju podskupina.

Napomena: upotreba znaka izmjene u ovom slučaju. stake.com ili dionik će se i dalje pretraživati. Pronađen je izlaz sljedećeg koda:

str='Web stranica, udio.com je za poslovanje.'
ako [[ $ str= ~ ulog(.s|držač) ]];zatim
izbacitipronađeno
biti

Podniz koji se ovdje podudara je stake.com.

Unaprijed definirani niz BASH_REMATCH

BASH_REMATCH je unaprijed definirani niz. Pretpostavimo da uzorak ima grupe. Cijela grupa koja se podudara ide u ćeliju za indeks 0 ovog niza. Prva podgrupa koja se podudara ide u ćeliju za indeks 1; druga podgrupa se podudara, ide u ćeliju za indeks 2 itd. Sljedeći kôd pokazuje kako se koristi ovaj niz:

str='Došao je scenski plesač.'
ako [[ $ str= ~ pozornica (plesač) ]];zatim
izbacitipronađeno
biti

zaiu $ {! BASH_REMATCH [@]};čini
printf '$ {BASH_REMATCH [i]}, '
učinjeno
izbaciti

Izlaz je:

pronađeno
scenski plesač, plesač,

Cijela grupa je plesačica. Postoji samo jedna podskupina, a to je plesačica.

Napomena: prostor u uzorku je izbjegnut.

Podudaranje neovisnosti velikih/malih slova

Uparivanje, kako je gore objašnjeno, razlikuje velika i mala slova. Usklađivanje se može obaviti neovisno o slučaju. To je ilustrirano sljedećim kodom:

trgovine -snocasematch

str='Volimo dobru glazbu.'
ako [[ $ str= ~ Dobro]];zatim
izbacitipronađeno
biti

trgovine -unocasematch

Izlaz je: pronađen. Uzorak je, GoOd. Usklađeni podniz je 'dobar'. Zapazite kako je opcija nocasematch omogućena na početku segmenta koda, a onemogućena na kraju segmenta koda.

Dužina niza

Sintaksa za dobivanje duljine niza je:

$ {#PARAMETER}

Primjer:

str='Volimo dobru glazbu.'
izbaciti $ {# str}

Izlaz je: 19.

Smanjenje niza

Sintaksa za smanjenje niza je:

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

gdje odbrojavanje za OFFSET počinje od nule.

Sljedeći primjer pokazuje kako ukloniti prvih 11 znakova niza:

str='Uvijek plešem uz dobru glazbu.'
izbaciti $ {str: 10}

Izlaz je:

predanost dobroj glazbi.

Brojanje za LENGTH počinje od sljedećeg znaka. Sljedeći kôd prikazuje kako se dio u nizu može dopustiti:

str='Uvijek plešem uz dobru glazbu.'
izbaciti $ {str: 10: 6}

Izlaz je:

ance t

Uklonjeno je prvih 11 znakova; dopušteno je sljedećih 6 znakova, a ostali su znakovi automatski uklonjeni.

Traži i zamijeni

Kad se pronađe podniz, može se zamijeniti drugim podnizom. Sintaksa za ovo je:

gdje=$ {PARAMETER/PATTERN/REPLACEMENT}
gdje=$ {PARAMETER // UZORAK/ZAMJENA}
gdje=$ {PARAMETER/PATTERN}
gdje=$ {PARAMETER // PATTERN}

Za prvu sintaksu s jednom kosom crtom naprijed zamjenjuje se samo prvo podudaranje. Primjer:

str='U komori su štakor, šišmiš i mačka.'
pravo=$ {str/[cbr] u/velika krava}
izbaciti $ str
izbaciti $ ret

Izlaz je:

U komori su štakor, šišmiš i mačka.
U komori je velika krava, šišmiš i mačka.

Za drugu sintaksu s dvostrukim crtama naprijed zamjenjuju se sva pojavljivanja podudaranja. Primjer:

str='U komori su štakor, šišmiš i mačka.'
pravo=$ {str // [cbr] kod/velika krava}
izbaciti $ str
izbaciti $ ret

Izlaz je:

U komori su štakor, šišmiš i mačka.
U komori je velika krava, velika krava i velika krava.

Za treću sintaksu s jednom kosom crtom naprijed nema zamjene za prvo i jedino podudaranje.

Također, prvi pronađeni podniz je izbrisan. Primjer:

str='U komori su štakor, šišmiš i mačka.'
pravo=$ {str/[cbr] u}
izbaciti $ str
izbaciti $ ret

Za četvrtu sintaksu s dvostrukim crtama naprijed nema zamjene za sva podudaranja. Također, svi pronađeni podnizovi se brišu. Primjer:

str='U komori su štakor, šišmiš i mačka.'
pravo=$ {str // [cbr] u}
izbaciti $ str
izbaciti $ ret

Izlaz je:

U komori su štakor, šišmiš i mačka.
U komori se nalaze a, a i a.

Zaključak

Da biste provjerili ima li niz podniz u Bash -u, potrebno je upotrijebiti Pattern Matching. Usklađivanje uzoraka ne odvija se samo u dvostrukim zagradama uvjeta, [[. . . ]]. Također se može dogoditi u proširenju parametara, sa svojim $ {. . .}. Proširenjem parametara moguće je dobiti podniz pomoću indeksa.

Ono što je prikazano u ovom članku su najkritičnije točke u usklađivanju uzoraka. Ima još! Međutim, ono što bi čitatelj trebao dalje proučiti je proširenje naziva datoteke.