Hvordan sjekke om en streng inneholder en understring i Bash

How Check If String Contains Substring Bash



Spørsmålet er, hvordan sjekke om en streng inneholder en delstreng i Bash. Svaret er: bruk Pattern Matching. Dette gir opphav til et annet spørsmål, som er: hva er Pattern Matching? Vel, en setning i en setning har visse egenskaper. Det er derfor det skiller seg fra andre setninger i samme setning eller i andre setninger. Egenskapene kan kodes som et mønster. På den måten kan en bestemt setning i en streng identifiseres. Denne artikkelen forklarer hvordan du identifiserer en bestemt delstreng i en større streng, erstatter delstrengen som er matchet med en annen delstreng, og finner eventuell delstreng i en større streng etter indeks. Men før vi dykker ned i forklaringene, må man huske de forskjellige måtene en streng er etablert på i Bash.

String av Escaping Spaces

En streng kan konstrueres ved å erstatte hvert mellomrom med mellomromssekvens, ''; som i:







myVar= Turisme i Egypt er ett av landet 's ledende økonomiske næringer.
kastet ut $ myVar

Utgangen er:



Turisme i Egypt er en av landets ledende økonomiske næringer.



Merk: apostrofen brukte også romfluktsekvensen.





Strenge etter enkle sitater

Har programmereren tid til å unnslippe alle mellomrommene i en streng? Nei. Derfor er det bedre å bruke to enkle anførselstegn for å avgrense en streng; som for eksempel:

myVar='Turisme i Egypt er en av landet' ''s ledende økonomiske næringer.'

En enkelt sitert streng tillater ikke utvidelse (erstatter med dens effekt) av noen fluktsekvens. Heldigvis, hvis to strenger er kodet ved siden av hverandre, blir de tatt som en streng. En fluktsekvens kan settes inn i mellom, som gjort ovenfor. Rømningssekvensen ville bli utvidet. Så utgangen blir:



Turisme i Egypt er en av landets ledende økonomiske næringer.

String av Double Quotes

Med doble anførselstegn utvides ikke rømningssekvenser også, men variabler utvides. Følgende kode illustrerer dette:

myVar= Turisme i Egypt er ett av landet 's ledende økonomiske næringer.
kastet ut $ myVar

Utgangen er:

Turisme i Egypt er en av landets ledende økonomiske næringer.

Merk: apostrofen brukte også romfluktsekvensen.

I denne artikkelen er hovedtypen streng som vurderes strengen i enkle anførselstegn.

Grunnleggende om vanlig uttrykk

Regex

Vurder denne strengen:

Denne verden er egentlig ikke vårt hjem.

La verden være delstrengen av interesse. Deretter kalles den store strengen (hele strengen) målstrengen eller ganske enkelt målet. 'Verden' i sitater kalles det regulære uttrykket eller ganske enkelt regex. Innholdet, verden, er mønsteret, i dette tilfellet.

Enkel matchning

I den følgende koden, hvis ordet 'verden' er funnet i målet, vil vi si at ordet har blitt matchet.

s='Denne verden er egentlig ikke vårt hjem.'
reg='verden'
hvis [[ $ str= ~$ reg ]];deretter
kastet utfunnet
ellers
kastet utikke funnet
være

= ~, som er tildelingsoperatoren etterfulgt av ~, kalles bindingsoperatoren. Tilstanden sjekker om mønsteret samsvarer i målstrengen. Hvis en delstreng som tilsvarer mønsteret blir funnet i målet, viser ekko -setningen funnet. Hvis det ikke blir funnet, ekko -setningen ekko ikke funnet. Utgangen for denne koden er:

funnet

Som mønsteret, verden, finnes i målet. Vær oppmerksom på at avgrensningsområdet etter [[og før]] er opprettholdt.

Mønster

I koden ovenfor er 'verden' i anførselstegn regeks mens verden selv er mønsteret. Dette er et greit mønster. Imidlertid er de fleste mønstre ikke så enkle. Et mønster er en karakterisering av en delstreng som skal finnes. Og så bruker Bash -mønsteret visse metategn. En metakarakter er et tegn om andre tegn. For eksempler bruker Bash Pattern følgende metategn:

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

Et vanlig uttrykk kan også skrives inn i tilstanden doble parenteser. Men det trenger ikke være i anførselstegn. Så i dette tilfellet er det bokstavelig talt et mønster.

Karakterklasser

Firkantede braketter

Utdataene fra følgende kode er funnet, noe som betyr at en kamp fant sted:

s='Katten kom inn i kammeret.'
hvis [[ $ str= ~[cbr]]];deretter
kastet utfunnet
være

Mønsteret, [cbr] at har matchet katten, som begynner med ‘c’, og som fortsetter og slutter med kl. [cbr] betyr, match 'c' eller 'b' eller 'r' etterfulgt av kl.

Utdataene fra følgende kode er funnet, noe som betyr at en kamp fant sted:

s='Flaggermusen kom inn i kammeret.'
hvis [[ $ str= ~[cbr]]];deretter
kastet utfunnet
være

Mønsteret, [cbr] at har matchet flaggermus, som begynner med ‘b’, og som fortsetter og slutter med kl. [cbr] betyr, match 'c' eller 'b' eller 'r' etterfulgt av kl.

Utdataene fra følgende kode er funnet, noe som betyr at en kamp fant sted:

s='Rotten kom inn i kammeret.'
hvis [[ $ str= ~[cbr]]];deretter
kastet utfunnet
være

Mønsteret, [cbr] at har matchet rotte, som begynner med ‘r’, og som fortsetter og slutter med kl.

I ovennevnte kodeeksempler vet ikke programmereren om det finnes katt, flaggermus eller rotte i målstrengen. Men han vet at delstrengen begynner med enten 'c' eller 'b' eller 'r', deretter fortsetter og slutter med kl. Firkantede parenteser i et mønster tillater forskjellige mulige tegn å matche ett tegn på en posisjon i forhold til andre i målet. Så firkantede parenteser inneholder et sett med tegn, hvorav en er tilpasset for en delstreng. Til slutt er det hele delstrengen som matches.

Utvalg av tegn

I koden ovenfor er [cbr] en klasse. Selv om 'c' eller 'b' eller 'r' tilsvarer et enkelt tegn, vil det umiddelbart ikke stemme overens med det som følger.

Vel, det er visse områder som vil danne en klasse. For eksempel danner 0 til 9 sifre klassen, [0-9] med 0 og 9 inkludert. Små 'a' til 'z' danner klassen [a-z] med 'a' og 'z' inkludert. Store 'A' til 'Z' danner klassen [A-Z] med 'A' og 'Z' inkludert. Fra en klasse er det en av karakterene som matcher ett tegn i strengen.

Følgende kode gir et treff:

hvis [[ 'ID8id'= ~[0-9] ]];deretter
kastet utfunnet
være

Denne gangen er målet en bokstavelig streng i tilstanden. 8, som er et av de mulige tallene i området, [0-9], har matchet 8 i strengen, ‘ID8id’. Koden ovenfor tilsvarer:

hvis [[ 'ID8id'= ~[0123456789] ]];deretter
kastet utfunnet
være

Her er alle mulige tall skrevet i mønsteret, så det er ingen bindestrek.

I følgende kode oppnås en kamp:

hvis [[ 'ID8iD'= ~[a-z] ]];deretter
kastet utfunnet
være

Matchen er mellom små 'i' i området, [a-z] og små 'i' i målstrengen, 'ID8iD'.

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

hvis [[ 'ID8id er identifikatoren'= ~ ID[0-9]id ]];deretter
kastet utfunnet
være

Utgangen er: funnet. 'ID8id' fra mønsteret har matchet 'ID8id' i målstrengen.

Negasjon

Matching er ikke hentet fra følgende kode:

hvis [[ '0123456789101112'= ~[^0-9] ]];deretter
kastet utfunnet
ellers
kastet utikke funnet
være

Utgangen er:

ikke funnet

Uten ^ foran området, innenfor firkantede parenteser, hadde null av området matchet den første nullen til målstrengen. Så, ^ foran et område (eller valgfrie tegn) negerer klassen.

Følgende kode gir en treff fordi betingelsen lyder: match et hvilket som helst ikke-sifferlig tegn hvor som helst i målet:

hvis [[ 'ABCDEFGHIJ'= ~[^0-9] ]];deretter
kastet utfunnet
ellers
kastet utikke funnet
være

Så utgangen er: funnet.

[^0-9] betyr et ikke-siffer, så [^0-9] er negasjonen av [0-9].

[^a-z] betyr en ikke-liten bokstav, så [^a-z] er negasjonen av [a-z].

[^A-Z] betyr en bokstav uten store bokstaver, så [^A-Z] er negasjonen av [A-Z].

Andre negasjoner er tilgjengelige.

Perioden (.) I mønsteret

Perioden (.) I mønsteret samsvarer med ethvert tegn inkludert seg selv. Vurder følgende kode:

hvis [[ '6759WXY.A3'= ~ 7.9W.Y.A]];deretter
kastet utfunnet
være

Utdataene fra koden er funnet fordi de andre tegnene stemmer overens. En prikk matcher ‘5’; en annen prikk matcher ‘X’; og den siste prikken samsvarer med en prikk.

Matchende alternativ

Vurder denne setningen for en målstreng:

Buret har fugler av forskjellige typer.

Noen vil kanskje vite om dette målet har due eller påfugl eller ørn. Følgende kode kan brukes:

s='Buret har påfugler av forskjellige typer.'
hvis [[ $ str= ~ due|påfugl|Ørn]];deretter
kastet utfunnet
ellers
kastet utikke funnet
være

Utgangen er funnet. Alternativmetakarakteren, | har vært ansatt. Det kan være to, tre, fire og flere alternativer. Det som har matchet i denne koden er 'påfugl'.

Gruppering

I følgende mønster har parenteser blitt brukt til å gruppere tegn:

en scene (danser)

Gruppen her er en scenedanser omgitt av metakarakterene (og). (danser) er en undergruppe, mens en scene (danser) er hele gruppen. Vurder følgende:

(Danseren er fantastisk)

Her er undergruppen eller delstrengen, danser er fantastisk.

Substrings med vanlige deler

En interessent er en person med interesse i en virksomhet. Tenk deg en virksomhet med et nettsted, stake.com. Tenk deg at en av følgende målstrenger er i datamaskinen:

Nettstedet, stake.com er for virksomheten .;

Det er interessenten .;

Interessenten jobber for stake.com .;

La noen av disse strengene være målet. Programmereren vil kanskje vite om stake.com eller interessent er i hvilken som helst målstreng. Mønsteret hans ville være:

stake.com | interessent

ved hjelp av veksling.

innsatsen har blitt skrevet to ganger i de to ordene. Dette kan unngås ved å skrive mønsteret slik:

innsats (.com | innehaver)

.com | innehaver er undergruppen i dette tilfellet.

Merk: bruk av vekslingstegnet i dette tilfellet. stake.com eller interessent vil fortsatt bli søkt. Utdataene fra følgende kode er funnet:

s='Nettstedet, stake.com er for virksomheten.'
hvis [[ $ str= ~ innsats(.med|holder) ]];deretter
kastet utfunnet
være

Delstrengen som matches her er stake.com.

BASH_REMATCH forhåndsdefinert matrise

BASH_REMATCH er en forhåndsdefinert matrise. Anta at et mønster har grupper. Hele gruppen matchet, går inn i cellen for indeks 0 i denne matrisen. Den første undergruppen som samsvarer, går inn i cellen for indeks 1; den andre undergruppen matchet, går inn i cellen for indeks 2, og så videre. Følgende kode viser hvordan du bruker denne matrisen:

s='Scenedanseren har kommet.'
hvis [[ $ str= ~ trinn (danser) ]];deretter
kastet utfunnet
være

tilJegi $ {! BASH_REMATCH [@]};gjøre
printf '$ {BASH_REMATCH [i]}, '
gjort
kastet ut

Utgangen er:

funnet
scenedanser, dansere,

Hele gruppen er scenedanser. Det er bare en undergruppe, som er danser.

Merk: Plassen i mønsteret er rømt.

Uavhengighet og store bokstaver uavhengig

Matching, som forklart ovenfor, er saksfølsomt. Matching kan gjøres uavhengig av saken. Dette er illustrert i følgende kode:

butikker -snocasematch

s='Vi liker god musikk.'
hvis [[ $ str= ~ GoOd]];deretter
kastet utfunnet
være

butikker -unocasematch

Utgangen er: funnet. Mønsteret er, GoOd. Delstrengen som matches er 'bra'. Legg merke til hvordan alternativet nocasematch har blitt aktivert i begynnelsen av kodesegmentet og deaktivert på slutten av kodesegmentet.

Lengde på en streng

Syntaksen for å få lengden på en streng er:

$ {#PARAMETER}

Eksempel:

s='Vi liker god musikk.'
kastet ut $ {# str}

Utgangen er: 19.

Strengreduksjon

Syntakser for strengreduksjon er:

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

hvor tellingen for OFFSET begynner fra null.

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

s='Jeg danser alltid til god musikk.'
kastet ut $ {str: 10}

Utgangen er:

til god musikk.

Teller for LENGTH, begynner fra neste tegn. Følgende kode viser hvordan en del i strengen kan tillates:

s='Jeg danser alltid til god musikk.'
kastet ut $ {str: 10: 6}

Utgangen er:

anse t

De første 11 tegnene ble fjernet; de neste 6 tegnene ble tillatt, og resten av tegnene ble automatisk fjernet.

Søk og erstatt

Når en delstreng blir funnet, kan den erstattes med en annen delstreng. Syntakser for dette er:

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

For den første syntaksen med enkelt skråstrek, er bare den første kampen erstattet. Eksempel:

s='Det er en rotte, en flaggermus og en katt i kammeret.'
Ikke sant=$ {str/[cbr] at/big cow}
kastet ut $ str
kastet ut $ ret

Utgangen er:

Det er en rotte, en flaggermus og en katt i kammeret.
Det er en stor ku, en flaggermus og en katt i kammeret.

For den andre syntaksen med doble skråstreker, blir alle forekomster av kampen erstattet. Eksempel:

s='Det er en rotte, en flaggermus og en katt i kammeret.'
Ikke sant=$ {str // [cbr] at/big cow}
kastet ut $ str
kastet ut $ ret

Utgangen er:

Det er en rotte, en flaggermus og en katt i kammeret.
Det er en stor ku, en stor ku og en stor ku i kammeret.

For den tredje syntaksen med enkelt skråstrek, er det ingen erstatning for den første og eneste kampen.

Den første delstrengen som ble funnet, blir også slettet. Eksempel:

s='Det er en rotte, en flaggermus og en katt i kammeret.'
Ikke sant=$ {str/[cbr] kl.}
kastet ut $ str
kastet ut $ ret

For den fjerde syntaksen med doble skråstreker, er det ingen erstatning for alle kampene. Alle subtrene som er funnet, blir også slettet. Eksempel:

s='Det er en rotte, en flaggermus og en katt i kammeret.'
Ikke sant=$ {str // [cbr] kl.}
kastet ut $ str
kastet ut $ ret

Utgangen er:

Det er en rotte, en flaggermus og en katt i kammeret.
Det er a, a og a i kammeret.

Konklusjon

For å sjekke om en streng har en delstreng i Bash, må Pattern Matching brukes. Mønstermatching finner ikke bare sted i tilstanden doble parenteser, [[. . . ]]]. Det kan også skje i parameterutvidelse, med $ {. . .}. Med parameterutvidelse er det mulig å skaffe en delstreng ved indekser.

Det som har blitt presentert i denne artikkelen er de mest kritiske punktene i Pattern Matching. Det er mer! Det leseren bør studere videre, er filnavnutvidelse.