Hur man kontrollerar om en sträng innehåller en delsträng i Bash

How Check If String Contains Substring Bash



Frågan är hur man kontrollerar om en sträng innehåller en delsträng i Bash. Svaret är: använd Pattern Matching. Detta ger upphov till en annan fråga, som är: vad är mönstermatchning? Tja, en fras i en mening har vissa egenskaper. Det är därför det skiljer sig från andra fraser i samma mening eller i andra meningar. Egenskaperna kan kodas som ett mönster. På det sättet kan en särskild fras i en sträng identifieras. Den här artikeln förklarar hur man identifierar en viss delsträng i en större sträng, ersätter delsträngen som matchas med en annan delsträng och lokaliserar eventuell delsträng i en större sträng efter index. Men innan man dyker ner i förklaringarna måste man komma ihåg de olika sätten en sträng upprättas i Bash.

Sträng av Escaping Spaces

En sträng kan konstrueras genom att varje utrymme ersätts med utrymningsflyktssekvensen, ''; som i:







myVar= Turism i Egypt är ett av landet 's ledande ekonomiska industrier.
kastade ut $ myVar

Utgången är:



Turismen i Egypten är en av landets ledande ekonomiska industrier.



Notera: apostrofen använde också rymdflyktssekvensen.





Sträng med enkla citat

Har programmeraren tid att fly alla mellanslag i en sträng? Nej. Därför är det bättre att använda två enkla citattecken för att avgränsa en sträng. Till exempel:

myVar='Turismen i Egypten är en av landet' 'är ledande ekonomiska industrier. '

En enkelciterad sträng tillåter inte expansion (ersätter med dess effekt) av någon escape-sekvens. Lyckligtvis, om två strängar är kodade bredvid varandra, kommer de att tas som en sträng. En flyktsekvens kan infogas mittemellan, som ovan. Escape -sekvensen skulle utökas. Så utsignalen blir:



Turismen i Egypten är en av landets ledande ekonomiska industrier.

Sträng med dubbla citat

Med dubbla citattecken expanderas inte Escape -sekvenser också, utan variabler expanderas. Följande kod illustrerar detta:

myVar= Turism i Egypt är ett av landet 's ledande ekonomiska industrier.
kastade ut $ myVar

Utgången är:

Turismen i Egypten är en av landets ledande ekonomiska industrier.

Notera: apostrofen använde också rymdflyktssekvensen.

I den här artikeln är den huvudsakliga strängtypen strängen i enskilda citattecken.

Grundläggande uttryck för reguljärt uttryck

Regex

Tänk på den här strängen:

Den här världen är inte riktigt vårt hem.

Låt världen vara delsträngen av intresse. Sedan kallas den stora strängen (hela strängen) för målsträngen eller helt enkelt målet. 'Världen' i citat kallas det reguljära uttrycket eller helt enkelt regex. Innehållet, världen, är mönstret, i det här fallet.

Enkel matchning

I följande kod, om ordet 'värld' finns i målet, skulle vi säga att ordet har matchats.

sid='Den här världen är inte riktigt vårt hem.'
reg='värld'
om [[ $ str= ~$ reg ]];sedan
kastade uthittades
annan
kastade uthittades inte
vara

= ~, som är tilldelningsoperatören följt av ~, kallas bindningsoperatorn. Villkoret kontrollerar om mönstret matchas i målsträngen. Om en delsträng som motsvarar mönstret hittas i målet, visar eko -satsen hittat. Om det inte hittas, ekosetningen ekon hittades inte. Utdata för denna kod är:

hittades

Som mönstret, världen, finns i målet. Observera att det avgränsande utrymmet efter [[och före]] har bibehållits.

Mönster

I koden ovan är 'världen' i citat regex medan världen i sig är mönstret. Detta är ett enkelt mönster. Men de flesta mönster är inte så enkla. Ett mönster är en karakterisering av en delsträng som ska hittas. Och så använder Bash -mönstret vissa metatecken. En metakaraktär är ett tecken om andra tecken. För exempel använder Bash Pattern följande metatecken:

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

Ett reguljärt uttryck kan också skrivas in i villkorets dubbla parenteser. Men det behöver inte vara i citattecken. Så i det här fallet är det bokstavligen ett mönster.

Teckenklasser

Hakparentes

Utmatningen av följande kod hittas, vilket betyder att en matchning ägde rum:

sid='Katten kom in i kammaren.'
om [[ $ str= ~[cbr]]];sedan
kastade uthittades
vara

Mönstret, [cbr] at har matchat katt, som börjar med ‘c’, och som fortsätter och slutar med kl. [cbr] betyder, matcha 'c' eller 'b' eller 'r' följt av kl.

Utmatningen av följande kod hittas, vilket betyder att en matchning ägde rum:

sid='Fladdermusen kom in i kammaren.'
om [[ $ str= ~[cbr]]];sedan
kastade uthittades
vara

Mönstret, [cbr] at har matchat fladdermus, som börjar med ‘b’, och som fortsätter och slutar med kl. [cbr] betyder, matcha 'c' eller 'b' eller 'r' följt av kl.

Utmatningen av följande kod hittas, vilket betyder att en matchning ägde rum:

sid='Råttan kom in i kammaren.'
om [[ $ str= ~[cbr]]];sedan
kastade uthittades
vara

Mönstret, [cbr] at har matchat råtta, som börjar med ‘r’, och som fortsätter och slutar med kl.

I ovanstående kodprover vet programmeraren inte om det finns katt, fladdermus eller råtta i målsträngen. Men han vet att delsträngen börjar med antingen 'c' eller 'b' eller 'r', fortsätter sedan och slutar med kl. Fyrkantiga parenteser i ett mönster tillåter olika möjliga tecken att matcha ett tecken i en position i förhållande till andra i målet. Så, hakparenteser innehåller en uppsättning tecken, varav en matchas för en delsträng. Slutligen är det hela delsträngen som matchas.

Utbud av tecken

I koden ovan är [cbr] en klass. Även om 'c' eller 'b' eller 'r' motsvarar ett enda tecken, om det som följer omedelbart inte matchar, kommer mönstret inte att matcha någonting.

Tja, det finns vissa intervall som kommer att utgöra en klass. Till exempel utgör 0 till 9 siffror klassen, [0-9] med 0 och 9 inkluderade. Små 'a' till 'z' utgör klassen [a-z] med 'a' och 'z' inkluderat. Versalerna ”A” till ”Z” utgör klassen [A-Z] med ”A” och ”Z” inkluderat. Från en klass är det en av karaktärerna som matchar ett tecken i strängen.

Följande kod ger en matchning:

om [[ 'ID8id'= ~[0-9] ]];sedan
kastade uthittades
vara

Den här gången är målet en bokstavlig sträng i tillståndet. 8, som är ett av de möjliga siffrorna inom intervallet, [0-9], har matchat 8 i strängen, 'ID8id'. Ovanstående kod motsvarar:

om [[ 'ID8id'= ~[0123456789] ]];sedan
kastade uthittades
vara

Här har alla möjliga siffror skrivits i mönstret, så det finns ingen bindestreck.

I följande kod erhålls en matchning:

om [[ 'ID8iD'= ~[a-z] ]];sedan
kastade uthittades
vara

Matchningen är mellan små 'i' i intervallet, [a-z] och små 'i' i målsträngen, 'ID8iD'.

Kom ihåg: intervallet är en klass. Klassen kan vara en del av ett större mönster. Så i ett mönster kan texten vara framför och/eller efter klassen. Följande kod illustrerar detta:

om [[ 'ID8id är identifieraren'= ~ ID[0-9]id ]];sedan
kastade uthittades
vara

Utdata är: hittat. 'ID8id' från mönstret har matchat 'ID8id' i målsträngen.

Negation

Matchning erhålls inte från följande kod:

om [[ '0123456789101112'= ~[^0-9] ]];sedan
kastade uthittades
annan
kastade uthittades inte
vara

Utgången är:

hittades inte

Utan ^ framför intervallet, inom hakparenteserna, hade noll i intervallet matchat den första nollan i målsträngen. Så, ^ framför ett intervall (eller valfria tecken) förnekar klassen.

Följande kod producerar en matchning eftersom villkoret lyder: matcha alla icke-siffriga tecken var som helst i målet:

om [[ 'ABCDEFGHIJ'= ~[^0-9] ]];sedan
kastade uthittades
annan
kastade uthittades inte
vara

Så utgången är: hittad.

[^0-9] betyder en icke-siffrig, så [^0-9] är negationen av [0-9].

[^a-z] betyder en icke-liten bokstav, så [^a-z] är negationen av [a-z].

[^A-Z] betyder en stor bokstav, så [^A-Z] är negationen av [A-Z].

Andra negationer är tillgängliga.

Perioden (.) I mönstret

Perioden (.) I mönstret matchar alla tecken inklusive sig själv. Tänk på följande kod:

om [[ '6759WXY.A3'= ~ 7,9W.Y.A]];sedan
kastade uthittades
vara

Kodens utmatning hittas eftersom de andra tecknen matchar. En punkt matchar '5'; en annan punkt matchar 'X'; och den sista pricken matchar en prick.

Matchande alternativ

Tänk på denna mening för en målsträng:

Buren har fåglar av olika slag.

Någon kanske vill veta om detta mål har duva eller påfågel eller örn. Följande kod kan användas:

sid='Buren har påfåglar av olika slag.'
om [[ $ str= ~ duva|påfågel|Örn]];sedan
kastade uthittades
annan
kastade uthittades inte
vara

Utgången är, hittad. Alternativmetakaraktären, | har varit anställd. Det kan finnas två, tre, fyra och fler alternativ. Det som har matchat i denna kod är 'påfågel'.

Gruppering

I följande mönster har parenteser använts för att gruppera tecken:

en scen (dansare)

Gruppen här är en scendansare omgiven av metatecknen (och). (dansare) är en undergrupp, medan en scen (dansare) är hela gruppen. Tänk på följande:

(Dansaren är fantastisk)

Här är undergruppen eller delsträngen, dansare är fantastisk.

Substrings med gemensamma delar

En intressent är en person som är intresserad av ett företag. Föreställ dig ett företag med en webbplats, stake.com. Tänk dig att en av följande målsträngar finns i datorn:

Webbplatsen, stake.com är för verksamheten .;

Det finns intressenten .;

Intressenten arbetar för stake.com .;

Låt någon av dessa strängar vara målet. Programmeraren kanske vill veta om stake.com eller intressenter är i vilken målsträng som helst. Hans mönster skulle vara:

stake.com | intressent

med alternering.

insats har skrivits två gånger i de två orden. Detta kan undvikas genom att skriva mönstret enligt följande:

insats (.com | innehavare)

.com | innehavare är undergruppen i det här fallet.

Obs: användningen av alternativtecken i detta fall. stake.com eller intressenter kommer fortfarande att sökas. Utdata från följande kod hittas:

sid='Webbplatsen, stake.com är för verksamheten.'
om [[ $ str= ~ insats(.med|hållare) ]];sedan
kastade uthittades
vara

Delsträngen som matchas här är stake.com.

BASH_REMATCH fördefinierade matris

BASH_REMATCH är en fördefinierad array. Antag att ett mönster har grupper. Hela gruppen matchade, går in i cellen för index 0 i denna array. Den första matchade undergruppen går in i cellen för index 1; den andra undergruppen matchade, går in i cellen för index 2, och så vidare. Följande kod visar hur du använder den här matrisen:

sid='Scendansaren har kommit.'
om [[ $ str= ~ steg (dansare) ]];sedan
kastade uthittades
vara

förii $ {! BASH_REMATCH [@]};do
printf '$ {BASH_REMATCH [i]}, '
Gjort
kastade ut

Utgången är:

hittades
scendansare, dansare,

Hela gruppen är scendansare. Det finns bara en undergrupp, som är dansare.

Obs! Utrymmet i mönstret har undkommit.

Oberoende/versal -matchning

Matchning, som förklarat ovan, är skiftlägeskänsligt. Matchning kan göras oberoende av fallet. Detta illustreras i följande kod:

butiker -snocasematch

sid='Vi gillar bra musik.'
om [[ $ str= ~ GoOd]];sedan
kastade uthittades
vara

butiker -unocasematch

Utdata är: hittat. Mönstret är, GoOd. Delsträngen som matchas är 'bra'. Observera hur alternativet nocasematch har aktiverats i början av kodsegmentet och inaktiverats i slutet av kodsegmentet.

Strängens längd

Syntaxen för att få längden på en sträng är:

$ {#PARAMETER}

Exempel:

sid='Vi gillar bra musik.'
kastade ut $ {# str}

Utgången är: 19.

Strängreduktion

Syntaxerna för strängreduktion är:

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

där räkningen för OFFSET börjar från noll.

Följande exempel visar hur du tar bort de första 11 tecknen i en sträng:

sid='Jag dansar alltid till bra musik.'
kastade ut $ {str: 10}

Utgången är:

för god musik.

Räkna för LÄNGD, börjar från nästa tecken. Följande kod visar hur en del i strängen kan tillåtas:

sid='Jag dansar alltid till bra musik.'
kastade ut $ {str: 10: 6}

Utgången är:

an t

De första 11 tecknen togs bort; de nästa 6 tecknen tilläts, och resten av tecknen togs bort automatiskt.

Sök och ersätt

När en delsträng hittas kan den ersättas med en annan delsträng. Syntaxerna för detta är:

var=$ {PARAMETER/MÖNSTER/BYT}
var=$ {PARAMETER // PATTERN/REPLACEMENT}
var=$ {PARAMETER/MÖNSTER}
var=$ {PARAMETER // PATTERN}

För den första syntaxen med enda snedstreck, bara den första matchningen ersätts. Exempel:

sid='Det finns en råtta, en fladdermus och en katt i kammaren.'
höger=$ {str/[cbr] at/big cow}
kastade ut $ str
kastade ut $ ret

Utgången är:

Det finns en råtta, en fladdermus och en katt i kammaren.
Det finns en stor ko, en fladdermus och en katt i kammaren.

För den andra syntaxen med dubbla snedstreck, alla förekomster av matchen ersätts. Exempel:

sid='Det finns en råtta, en fladdermus och en katt i kammaren.'
höger=$ {str // [cbr] at/big cow}
kastade ut $ str
kastade ut $ ret

Utgången är:

Det finns en råtta, en fladdermus och en katt i kammaren.
Det finns en stor ko, en stor ko och en stor ko i kammaren.

För den tredje syntaxen med enda snedstreck, finns det ingen ersättning för den första och enda matchningen.

Dessutom raderas den första hittade delsträngen. Exempel:

sid='Det finns en råtta, en fladdermus och en katt i kammaren.'
höger=$ {str/[cbr] kl.}
kastade ut $ str
kastade ut $ ret

För den fjärde syntaxen med dubbla snedstreck, finns det ingen ersättning för alla matchningar. Alla underlag som hittas raderas också. Exempel:

sid='Det finns en råtta, en fladdermus och en katt i kammaren.'
höger=$ {str // [cbr] at}
kastade ut $ str
kastade ut $ ret

Utgången är:

Det finns en råtta, en fladdermus och en katt i kammaren.
Det finns a, a och a i kammaren.

Slutsats

För att kontrollera om en sträng har en delsträng i Bash måste Pattern Matching användas. Mönstermatchning sker inte bara i villkoret dubbla parenteser, [[. . . ]]]. Det kan också ske i parameterutvidgning, med dess $ {. . .}. Med parameterutvidgning är det möjligt att få en delsträng med index.

Det som har presenterats i den här artikeln är de mest kritiska punkterna i mönstermatchning. Det finns fler! Vad läsaren bör studera härnäst är dock filnamnsexpansion.