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]på]];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]på]];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]på]];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] ]];dereftersmed 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] ]];dereftersmed 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] ]];dereftersmed 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 ]];dereftersmed 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] ]];dereftersmed 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] ]];dereftersmed 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]];dereftersmed 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 -snocasematchs='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.