Sådan kontrolleres, om en streng indeholder en substring i Bash

How Check If String Contains Substring Bash



Spørgsmålet er, hvordan man kontrollerer, om en streng indeholder en understreng i Bash. Svaret er: brug Pattern Matching. Dette giver anledning til et andet spørgsmål, som er: hvad er Pattern Matching? Nå, en sætning i en sætning har visse egenskaber. Det er derfor, det adskiller sig fra andre sætninger i den samme sætning eller i andre sætninger. Egenskaberne kan kodes som et mønster. På den måde kan en bestemt sætning i en streng identificeres. Denne artikel forklarer, hvordan du identificerer en bestemt delstreng i en større streng, erstatter delstrengen, der matcher med en anden delstreng, og lokaliserer enhver delstreng i en større streng efter indeks. Men før man dykker ned i forklaringerne, skal man huske de forskellige måder, hvorpå en streng etableres i Bash.

String ved Escaping Spaces

En streng kan konstrueres ved at udskifte hvert mellemrum med rumflugtssekvensen, ''; som i:







myVar= Turisme i Egypt er et af landet 's førende økonomiske industrier.
smed ud $ myVar

Outputtet er:



Turisme i Egypten er en af ​​landets førende økonomiske industrier.



Bemærk: apostrofen brugte også rumflugtssekvensen.





String ved enkelte citater

Har programmøren tid til at undslippe alle mellemrum i en streng? Nej. Derfor er det bedre at bruge to enkelte citater til at afgrænse en streng; såsom:

myVar='Turisme i Egypten er et af landene' 'er førende økonomiske industrier. '

En enkeltciteret streng tillader ikke udvidelse (erstatning med dens virkning) af nogen flugtsekvens. Heldigvis, hvis to strenge er kodet ved siden af ​​hinanden, bliver de taget som en streng. En flugtsekvens kan indsættes imellem som beskrevet ovenfor. Escape -sekvensen ville blive udvidet. Så output bliver:



Turisme i Egypten er en af ​​landets førende økonomiske industrier.

String ved dobbelte citater

Med dobbelte citater udvides escape -sekvenser ikke også, men variabler udvides. Følgende kode illustrerer dette:

myVar= Turisme i Egypt er et af landet 's førende økonomiske industrier.
smed ud $ myVar

Outputtet er:

Turisme i Egypten er en af ​​landets førende økonomiske industrier.

Bemærk: apostrofen brugte også rumflugtssekvensen.

I denne artikel er den vigtigste type streng, der overvejes, strengen i enkelte anførselstegn.

Grundlæggende regler for regulær udtryk

Regex

Overvej denne streng:

Denne verden er ikke rigtig vores hjem.

Lad verden være delstrengen af ​​interesse. Derefter kaldes den store streng (hele strengen) for målstrengen eller simpelthen målet. 'Verden' i citater kaldes det regulære udtryk eller simpelthen regex. Indholdet, verden, er mønsteret, i dette tilfælde.

Enkel matchning

I den følgende kode, hvis ordet 'verden' findes i målet, vil vi sige, at ordet er blevet matchet.

s='Denne verden er egentlig ikke vores hjem.'
reg='verden'
hvis [[ $ str= ~$ reg ]];derefter
smed udfundet
andet
smed udikke fundet
være

= ~, som er tildelingsoperatoren efterfulgt af ~, kaldes bindingsoperatoren. Betingelsen kontrollerer, om mønsteret matcher i målstrengen. Hvis der findes en delstreng svarende til mønsteret i målet, viser ekkosætningen fundet. Hvis den ikke findes, ekko -sætningen ekko ikke fundet. Outputtet til denne kode er:

fundet

Som mønsteret, verden, findes i målet. Bemærk, at det afgrænsende mellemrum efter [[og før]] er fastholdt.

Mønster

I ovenstående kode er 'verden' i citater regexet, mens verden selv er mønsteret. Dette er et ligetil mønster. De fleste mønstre er dog ikke så enkle. Et mønster er en karakterisering af en delstreng, der skal findes. Og så bruger Bash -mønsteret visse metategn. En metakarakter er et tegn om andre tegn. For eksempler bruger Bash Pattern følgende metategn:

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

Et regulært udtryk kan også skrives i tilstanden dobbelt parentes. Men det behøver ikke være i anførselstegn. Så i dette tilfælde er det bogstaveligt talt et mønster.

Karakterklasser

Firkantede beslag

Outputtet af følgende kode findes, hvilket betyder, at der fandt en match sted:

s='Katten kom ind i kammeret.'
hvis [[ $ str= ~[cbr]]];derefter
smed udfundet
være

Mønsteret, [cbr] at har matchet kat, som begynder med ‘c’, og som fortsætter og slutter med kl. [cbr] betyder, match 'c' eller 'b' eller 'r' efterfulgt af kl.

Outputtet af følgende kode findes, hvilket betyder, at der fandt en match sted:

s='Flagermusen kom ind i kammeret.'
hvis [[ $ str= ~[cbr]]];derefter
smed udfundet
være

Mønsteret, [cbr] at har matchet flagermus, som begynder med ‘b’, og som fortsætter og slutter med kl. [cbr] betyder, match 'c' eller 'b' eller 'r' efterfulgt af kl.

Outputtet af følgende kode findes, hvilket betyder, at der fandt en match sted:

s='Rotten kom ind i kammeret.'
hvis [[ $ str= ~[cbr]]];derefter
smed udfundet
være

Mønsteret, [cbr] at har matchet rotte, som begynder med ‘r’, og som fortsætter og slutter med kl.

I ovenstående kodeeksempler ved programmereren ikke, om der findes kat, flagermus eller rotte i målstrengen. Men han ved, at delstrengen begynder med enten 'c' eller 'b' eller 'r', derefter fortsætter og slutter med kl. Firkantede parenteser i et mønster tillader forskellige mulige tegn at matche et tegn på en position i forhold til andre i målet. Så firkantede parenteser indeholder et sæt tegn, hvoraf en matches til en delstreng. Endelig er det den komplette delstreng, der matches.

Serie af tegn

I ovenstående kode er [cbr] en klasse. Selvom 'c' eller 'b' eller 'r' svarer til et enkelt tegn, hvis det dernæst umiddelbart ikke matcher, vil mønsteret ikke matche noget.

Nå, der er visse områder, der vil danne en klasse. For eksempel danner 0 til 9 cifre klassen, [0-9] med 0 og 9 inkluderet. Små bogstaver 'a' til 'z' danner klassen [a-z] med 'a' og 'z' inkluderet. Store 'A' til 'Z' danner klassen [A-Z] med 'A' og 'Z' inkluderet. Fra en klasse er det et af de tegn, der matcher et tegn i strengen.

Følgende kode producerer et match:

hvis [[ 'ID8id'= ~[0-9] ]];derefter
smed udfundet
være

Denne gang er målet en bogstavelig streng i tilstanden. 8, som er et af de mulige tal inden for området, [0-9], har matchet 8 i strengen, 'ID8id'. Ovenstående kode svarer til:

hvis [[ 'ID8id'= ~[0123456789] ]];derefter
smed udfundet
være

Her er alle de mulige tal skrevet i mønsteret, så der er ingen bindestreg.

I følgende kode opnås et match:

hvis [[ 'ID8iD'= ~[a-z] ]];derefter
smed udfundet
være

Matchen er mellem små 'i' i intervallet, [a-z] og små 'i' i målstrengen, 'ID8iD'.

Husk: rækkevidden er en klasse. Klassen kan være en del af et større mønster. Så i et mønster kan teksten være foran og/eller efter timen. Følgende kode illustrerer dette:

hvis [[ 'ID8id er identifikatoren'= ~ ID[0-9]id ]];derefter
smed udfundet
være

Outputtet er: fundet. 'ID8id' fra mønsteret har matchet 'ID8id' i målstrengen.

Negation

Matchning opnås ikke fra følgende kode:

hvis [[ '0123456789101112'= ~[^0-9] ]];derefter
smed udfundet
andet
smed udikke fundet
være

Outputtet er:

ikke fundet

Uden ^ foran intervallet, inden for firkantede parenteser, ville nul i intervallet have matchet det første nul i målstrengen. Så ^ foran et område (eller valgfrie tegn) negerer klassen.

Følgende kode producerer et match, fordi betingelsen lyder: match ethvert ikke-cifret tegn overalt i målet:

hvis [[ 'ABCDEFGHIJ'= ~[^0-9] ]];derefter
smed udfundet
andet
smed udikke fundet
være

Så output er: fundet.

[^0-9] betyder et ikke-cifret, så [^0-9] er negationen af ​​[0-9].

[^a-z] betyder et ikke-lille bogstav, så [^a-z] er negationen af ​​[a-z].

[^A-Z] betyder et ikke-stort bogstav, så [^A-Z] er negationen af ​​[A-Z].

Andre negationer er tilgængelige.

Perioden (.) I mønsteret

Perioden (.) I mønsteret matcher ethvert tegn inklusive sig selv. Overvej følgende kode:

hvis [[ '6759WXY.A3'= ~ 7,9W.Y.A]];derefter
smed udfundet
være

Kodens output findes, fordi de andre tegn matcher. En prik matcher '5'; en anden prik matcher 'X'; og den sidste prik matcher en prik.

Matchende skifte

Overvej denne sætning for en målstreng:

Buret har fugle af forskellige typer.

Nogen vil måske vide, om dette mål har due eller påfugl eller ørn. Følgende kode kan bruges:

s='Buret har påfugle af forskellige typer.'
hvis [[ $ str= ~ due|påfugl|ørn]];derefter
smed udfundet
andet
smed udikke fundet
være

Outputtet er fundet. Alternativet metakarakter, | har været ansat. Der kan være to, tre, fire og flere alternativer. Det, der matchede i denne kode, er 'påfugl'.

Gruppering

I det følgende mønster er parenteser blevet brugt til at gruppere tegn:

en scene (danser)

Gruppen her er en scenedanser omgivet af metakaraktererne (og). (danser) er en undergruppe, mens en scene (danser) er hele gruppen. Overvej følgende:

(Danseren er fantastisk)

Her er undergruppen eller delstrengen, danser er fantastisk.

Substrings med fælles dele

En interessent er en person med interesse i en virksomhed. Forestil dig en virksomhed med et websted, stake.com. Forestil dig, at en af ​​følgende målstrenge er i computeren:

Webstedet, stake.com er for virksomheden .;

Der er interessenten .;

Interessenten arbejder for stake.com .;

Lad en af ​​disse strenge være målet. Programmereren vil måske vide, om stake.com eller interessenter er i hvilken som helst målstreng. Hans mønster ville være:

stake.com | interessent

ved hjælp af veksling.

indsats er blevet skrevet to gange i de to ord. Dette kan undgås ved at skrive mønsteret som følger:

indsats (.com | indehaver)

.com | indehaver er undergruppen i dette tilfælde.

Bemærk: brugen af ​​vekslingstegnet i dette tilfælde. stake.com eller interessent vil stadig blive gennemsøgt. Outputtet af følgende kode findes:

s='Webstedet, stake.com er for virksomheden.'
hvis [[ $ str= ~ indsats(.med|holder) ]];derefter
smed udfundet
være

Substrengen, der matches her, er stake.com.

BASH_REMATCH foruddefineret array

BASH_REMATCH er et foruddefineret array. Antag at et mønster har grupper. Hele gruppen matchede, går ind i cellen for indeks 0 i denne matrix. Den første undergruppe matchede, går ind i cellen for indeks 1; den anden undergruppe matchede, går ind i cellen for indeks 2 og så videre. Følgende kode viser, hvordan du bruger dette array:

s='Scenedanseren er kommet.'
hvis [[ $ str= ~ fase (danser) ]];derefter
smed udfundet
være

tiljegi $ {! BASH_REMATCH [@]};gøre
printf '$ {BASH_REMATCH [i]}, '
Færdig
smed ud

Outputtet er:

fundet
scenedanser, dansere,

Hele gruppen er scenedanser. Der er kun en undergruppe, som er danser.

Bemærk: Pladsen i mønsteret er undgået.

Uafhængighed i store/små bogstaver

Matchning, som forklaret ovenfor, er store og små bogstaver. Matchning kan foretages uafhængigt af sagen. Dette er illustreret i følgende kode:

butikker -snocasematch

s='Vi kan godt lide god musik.'
hvis [[ $ str= ~ GoOd]];derefter
smed udfundet
være

butikker -unocasematch

Outputtet er: fundet. Mønsteret er, GoOd. Den matchede delstreng er 'god'. Bemærk, hvordan nocasematch -indstillingen er blevet aktiveret i begyndelsen af ​​kodesegmentet og deaktiveret i slutningen af ​​kodesegmentet.

Længde på en streng

Syntaksen for at opnå længden af ​​en streng er:

$ {#PARAMETER}

Eksempel:

s='Vi kan godt lide god musik.'
smed ud $ {# str}

Outputtet er: 19.

Reduktion af strenge

Syntakser for strengreduktion er:

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

hvor tællingen til OFFSET begynder fra nul.

Følgende eksempel viser, hvordan du fjerner de første 11 tegn i en streng:

s='Jeg danser altid til god musik.'
smed ud $ {str: 10}

Outputtet er:

til god musik.

Tæller for LÆNGDE, begynder fra det næste tegn. Følgende kode viser, hvordan en del i strengen kan tillades:

s='Jeg danser altid til god musik.'
smed ud $ {str: 10: 6}

Outputtet er:

anse t

De første 11 tegn blev fjernet; de næste 6 tegn blev tilladt, og resten af ​​tegnene blev automatisk fjernet.

Søg og erstat

Når der findes en delstreng, kan den erstattes med en anden delstreng. Syntakser for dette er:

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

For den første syntaks med enkelt skråstreg, kun den første kamp erstattes. Eksempel:

s='Der er en rotte, en flagermus og en kat i kammeret.'
ret=$ {str/[cbr] hos/big cow}
smed ud $ str
smed ud $ret

Outputtet er:

Der er en rotte, en flagermus og en kat i kammeret.
Der er en stor ko, en flagermus og en kat i kammeret.

For den anden syntaks med dobbelte skråstreger udskiftes alle forekomster af kampen. Eksempel:

s='Der er en rotte, en flagermus og en kat i kammeret.'
ret=$ {str // [cbr] at/big cow}
smed ud $ str
smed ud $ret

Outputtet er:

Der er en rotte, en flagermus og en kat i kammeret.
Der er en stor ko, en stor ko og en stor ko i kammeret.

For den tredje syntaks med enkelt skråstreg er der ingen erstatning for det første og eneste match.

Den første fundne delstreng slettes også. Eksempel:

s='Der er en rotte, en flagermus og en kat i kammeret.'
ret=$ {str/[cbr] kl.}
smed ud $ str
smed ud $ret

For den fjerde syntaks med dobbelte skråstreger er der ingen erstatning for alle kampene. Alle fundne underlag slettes også. Eksempel:

s='Der er en rotte, en flagermus og en kat i kammeret.'
ret=$ {str // [cbr] kl.}
smed ud $ str
smed ud $ret

Outputtet er:

Der er en rotte, en flagermus og en kat i kammeret.
Der er a, a og a i kammeret.

Konklusion

For at kontrollere, om en streng har en delstreng i Bash, skal Pattern Matching bruges. Mønster Matchning finder ikke kun sted i tilstanden dobbelt parenteser, [[. . . ]]]. Det kan også finde sted i parameterudvidelse med dens $ {. . .}. Med parameterudvidelse er det muligt at få en delstreng ved indekser.

Det, der er blevet præsenteret i denne artikel, er de mest kritiske punkter i Pattern Matching. Der er flere! Men hvad læseren skal studere derefter, er filnavnudvidelse.