Kā pārbaudīt, vai virknē ir bash virkne

How Check If String Contains Substring Bash



Jautājums ir, kā pārbaudīt, vai virknē ir bash virkne. Atbilde ir: izmantojiet Pattern Matching. Tas rada vēl vienu jautājumu: kas ir Pattern Matching? Nu, frāzei teikumā ir noteiktas īpašības. Tāpēc tas atšķiras no citām frāzēm tajā pašā teikumā vai citos teikumos. Raksturlielumus var kodēt kā paraugu. Tādā veidā virknē var identificēt noteiktu frāzi. Šajā rakstā ir paskaidrots, kā noteikt virkni lielākas virknes, aizstāt apakšvirkni ar citu apakšvirkni un atrast jebkuru apakšvirkni lielākā virknē pēc indeksa. Tomēr, pirms iedziļināties skaidrojumos, jāatceras dažādi veidi, kā virkne tiek izveidota Bash.

Virkne pēc izbēgušām telpām

Virkni var veidot, aizstājot katru atstarpi ar atstarpes atstarpes secību, ‘’; kā:







myVar= Tūrisms iekšā Ēģipte ir viena valsts 's vadošās ekonomiskās nozares.
izmest ārā $ myVar

Rezultāts ir šāds:



Tūrisms Ēģiptē ir viena no valsts vadošajām ekonomikas nozarēm.



Piezīme: apostrofā tika izmantota arī kosmosa aizbēgšanas secība.





Virkne pēc atsevišķiem pēdiņām

Vai programmētājam ir laiks izbēgt no virknes atstarpēm? Nē. Tāpēc virknes norobežošanai labāk ir izmantot divus pēdiņus; piemēram:

myVar='Tūrisms Ēģiptē ir viena no valstīm' ''vadošās ekonomikas nozares.'

Viena citāta virkne neļauj paplašināt (aizstāt ar tās efektu) nevienu glābšanas secību. Par laimi, ja divas virknes ir kodētas viena otrai blakus, tās tiks uzskatītas par vienu virkni. Aizbēgšanas secību var ievietot starp tām, kā norādīts iepriekš. Bēgšanas secība tiks paplašināta. Tātad iznākums kļūst šāds:



Tūrisms Ēģiptē ir viena no valsts vadošajām ekonomikas nozarēm.

Virkne pēc divkāršiem pēdiņām

Izmantojot pēdiņas, aizbēgšanas secības netiek paplašinātas, bet mainīgie tiek paplašināti. To ilustrē šāds kods:

myVar= Tūrisms iekšā Ēģipte ir viena valsts 's vadošās ekonomiskās nozares.
izmest ārā $ myVar

Rezultāts ir šāds:

Tūrisms Ēģiptē ir viena no valsts vadošajām ekonomikas nozarēm.

Piezīme: apostrofā tika izmantota arī kosmosa aizbēgšanas secība.

Šajā rakstā galvenais virknes veids ir virkne atsevišķās pēdiņās.

Regulārās izteiksmes pamati

Regulārā izteiksme

Apsveriet šo virkni:

Šī pasaule nav īsti mūsu mājas.

Ļaujiet pasaulei būt interešu apakšvirknei. Tad lielo virkni (visu virkni) sauc par mērķa virkni vai vienkārši par mērķi. “Pasaule” pēdiņās tiek saukta par regulāro izteiksmi vai vienkārši - regex. Saturs, pasaule, ir modelis, šajā gadījumā.

Vienkārša saskaņošana

Turpmākajā kodā, ja mērķī tiek atrasts vārds “pasaule”, mēs teiktu, ka vārds ir saskaņots.

lpp='Šī pasaule nav īsti mūsu mājas.'
reģ='pasaule'
ja [[ $ str= ~$ reģ ]];tad
izmest ārāatrasts
citādi
izmest ārānav atrasts
būt

= ~, kas ir piešķiršanas operators, kam seko ~, sauc par saistošo operatoru. Nosacījums pārbauda, ​​vai raksts atbilst mērķa virknei. Ja mērķī tiek atrasta apakšvirkne, kas atbilst modelim, atbalss paziņojums parāda atrasto. Ja tas netiek atrasts, atbalss paziņojums atbalsojas nav atrasts. Šī koda izvade ir šāda:

atrasts

Tā kā modelis, pasaule, ir atrodams mērķī. Ņemiet vērā, ka norobežojošā atstarpe pēc [[un pirms]] ir saglabāta.

Raksts

Iepriekš minētajā kodā “pasaule” pēdiņās ir regulārā izteiksme, bet pati pasaule ir modelis. Tas ir vienkāršs modelis. Tomēr lielākā daļa modeļu nav tik vienkārši. Modelis ir atrodamas apakšvirknes raksturojums. Un tā, Bash modelis izmanto noteiktas meta rakstzīmes. Meta raksturs ir raksturs par citām rakstzīmēm. Piemēram, Bash Pattern izmanto šādas meta rakstzīmes:

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

Regulāro izteiksmi var ierakstīt arī dubultās iekavās. Bet tam nav jābūt pēdiņās. Tātad, šajā gadījumā tas ir burtiski modelis.

Rakstzīmju klases

Kvadrātiekavas

Tiek atrasts šāda koda izvade, kas nozīmē, ka ir notikusi atbilstība:

lpp='Kaķis ienāca kamerā.'
ja [[ $ str= ~[cbr]plkst]];tad
izmest ārāatrasts
būt

Modelis [cbr] at atbilst kaķim, kas sākas ar “c” un kas turpinās un beidzas ar. [cbr] pie nozīmē, sakrīt ar “c” vai “b” vai “r”, kam seko at.

Tiek atrasts šāda koda izvade, kas nozīmē, ka ir notikusi atbilstība:

lpp='Sikspārnis ienāca kamerā.'
ja [[ $ str= ~[cbr]plkst]];tad
izmest ārāatrasts
būt

Modelis [cbr] at ir saskaņots ar nūju, kas sākas ar “b” un kas turpinās un beidzas ar at. [cbr] pie nozīmē, sakrīt ar “c” vai “b” vai “r”, kam seko at.

Tiek atrasts šāda koda izvade, kas nozīmē, ka ir notikusi atbilstība:

lpp='Žurka ienāca kamerā.'
ja [[ $ str= ~[cbr]plkst]];tad
izmest ārāatrasts
būt

Modelis [cbr] at ir saskaņots ar žurku, kas sākas ar “r” un kas turpinās un beidzas ar at.

Iepriekš minētajos koda paraugos programmētājs nezina, vai mērķa virknē ir kaķis, sikspārnis vai žurka. Bet viņš zina, ka apakšvirkne sākas ar “c”, “b” vai “r”, pēc tam turpinās un beidzas ar. Kvadrātiekavas modelī ļauj dažādām iespējamām rakstzīmēm saskaņot vienu rakstzīmi pozīcijā attiecībā pret citām mērķa vietām. Tātad kvadrātiekavās ir rakstzīmju kopa, no kurām viena atbilst apakšvirknei. Visbeidzot, tiek saskaņota pilnā apakšvirkne.

Rakstzīmju klāsts

Iepriekš kodā [cbr] ir klase. Pat ja “c” vai “b” vai “r” atbilst vienai rakstzīmei, ja pēc tam uzreiz neatbilst, modelis neatbilst nevienam.

Ir daži diapazoni, kas veidos klasi. Piemēram, klasi veido no 0 līdz 9 cipariem, [0–9], ieskaitot 0 un 9. Mazie burti “a” līdz “z” veido klasi [a – z], ieskaitot “a” un “z”. Lielie burti “A” līdz “Z” veido klasi [A – Z], ieskaitot “A” un “Z”. No klases tā ir viena no rakstzīmēm, kas atbilst vienai virknes rakstzīmei.

Šis kods rada atbilstību:

ja [[ 'ID8id'= ~[0-9] ]];tad
izmest ārāatrasts
būt

Šoreiz mērķis ir nosacītā burtiskā virkne. 8, kas ir viens no iespējamiem skaitļiem diapazonā, [0-9], atbilst 8 rindā “ID8id”. Iepriekš minētais kods ir līdzvērtīgs:

ja [[ 'ID8id'= ~[0123456789] ]];tad
izmest ārāatrasts
būt

Šeit visi iespējamie skaitļi ir uzrakstīti šablonā, tāpēc nav defisi.

Ar šādu kodu tiek iegūta atbilstība:

ja [[ 'ID8iD'= ~[a – z] ]];tad
izmest ārāatrasts
būt

Atbilstība ir starp diapazona mazajiem “i” [a – z] un mērķa virknes “ID8iD” mazajiem “i”.

Atcerieties: diapazons ir klase. Klase var būt daļa no lielāka modeļa. Tātad rakstā teksts var būt klases priekšā un/vai pēc tās. To ilustrē šāds kods:

ja [[ “ID8id ir identifikators”= ~ ID[0-9]id ]];tad
izmest ārāatrasts
būt

Rezultāts ir: atrasts. “ID8id” no modeļa atbilst mērķa virknē “ID8id”.

Noliegums

Atbilstība netiek iegūta no šāda koda:

ja [[ '0123456789101112'= ~[^0-9] ]];tad
izmest ārāatrasts
citādi
izmest ārānav atrasts
būt

Rezultāts ir šāds:

nav atrasts

Ja diapazona priekšā nebūtu kvadrātiekavās, diapazona nulle atbilstu mērķa virknes pirmajai nullei. Tātad, ^ diapazona (vai izvēles rakstzīmju) priekšā noliedz klasi.

Šis kods rada atbilstību, jo nosacījums ir šāds: atbilst jebkurai bezciparu rakstzīmei jebkurā mērķa vietā:

ja [[ 'ABCDEFGHIJ'= ~[^0-9] ]];tad
izmest ārāatrasts
citādi
izmest ārānav atrasts
būt

Tātad rezultāts ir: atrasts.

[^0-9] nozīmē bezciparu skaitli, tāpēc [^0-9] ir [0-9] noliegums.

[^a-z] nozīmē burtu, kas nav mazais, tāpēc [^a-z] ir [a-z] noliegums.

[^A-Z] nozīmē burtu, kas nav lielais, tāpēc [^A-Z] ir [A-Z] noliegums.

Ir pieejamas arī citas negācijas.

Periods (.) Modelī

Periods (.) Modelī atbilst jebkurai rakstzīmei, ieskaitot sevi. Apsveriet šādu kodu:

ja [[ “6759WXY.A3”= ~ 7.9W.Y.A]];tad
izmest ārāatrasts
būt

Koda izvade ir atrasta, jo pārējās rakstzīmes atbilst. Viens punkts sakrīt ar “5”; vēl viens punkts atbilst “X”; un pēdējais punkts sakrīt ar punktu.

Atbilstoša alternatīva

Apsveriet šo teikumu mērķa virknei:

Būrī ir dažāda veida putni.

Kāds varētu vēlēties uzzināt, vai šim mērķim ir balodis, pāvi vai ērglis. Var izmantot šādu kodu:

lpp='Būrī ir dažāda veida pāvi.'
ja [[ $ str= ~ balodis|pāvs|ērglis]];tad
izmest ārāatrasts
citādi
izmest ārānav atrasts
būt

Rezultāts ir, atrasts. Maiņas meta raksturs, | ir nodarbināts. Var būt divas, trīs, četras un vairāk alternatīvas. Šajā kodā ir saskaņots “pāvs”.

Grupēšana

Šādā veidā rakstzīmes grupēšanai ir izmantotas iekavas:

skatuve (dejotāja)

Grupa šeit ir skatuves dejotāja, kuru ieskauj meta rakstzīmes (un). (dejotājs) ir apakšgrupa, savukārt skatuve (dejotāja) ir visa grupa. Apsveriet sekojošo:

(Dejotājs ir lielisks)

Šeit apakšgrupa vai apakšvirkne ir, dejotājs ir satriecošs.

Apakšvirknes ar kopējām daļām

Ieinteresētā persona ir persona, kurai ir interese par uzņēmējdarbību. Iedomājieties biznesu, kuram ir vietne stal.com. Iedomājieties, ka datorā ir viena no šīm mērķa virknēm:

Tīmekļa vietne, pea.com ir paredzēta biznesam .;

Ir ieinteresētā persona.;

Ieinteresētā persona strādā vietnē portal.com .;

Ļaujiet jebkurai no šīm virknēm būt mērķim. Programmētājs, iespējams, vēlēsies uzzināt, vai stal.com vai ieinteresētā persona ir kādā mērķa virknē. Viņa modelis būtu šāds:

ieinteres.com | ieinteresētā persona

izmantojot pārmaiņus.

likme divos vārdos ir ierakstīta divreiz. To var izvairīties, ierakstot modeli šādi:

miets (.com | turētājs)

.com | turētājs šajā gadījumā ir apakšgrupa.

Piezīme: šajā gadījumā izmantojiet maiņas rakstzīmi. joprojām tiks meklēta vietne. Tiek atrasts šāda koda izvads:

lpp='Tīmekļa vietne stal.com ir paredzēta biznesam.'
ja [[ $ str= ~ miets(.ar|turētājs) ]];tad
izmest ārāatrasts
būt

Šeit saskaņotā apakšvirkne ir stal.com.

Iepriekš definētais masīvs BASH_REMATCH

BASH_REMATCH ir iepriekš definēts masīvs. Pieņemsim, ka modelim ir grupas. Visa grupa sakrita, nonāk šī masīva indeksa 0 šūnā. Pirmā apakšgrupa sakrīt, iet uz indeksa 1 šūnu; otrā apakšgrupa sakrita, iet uz 2. indeksa šūnu un tā tālāk. Šis kods parāda, kā izmantot šo masīvu:

lpp='Ir atnākusi skatuves dejotāja.'
ja [[ $ str= ~ posms (dejotājs) ]];tad
izmest ārāatrasts
būt

priekšiiekšā $ {! BASH_REMATCH [@]};darīt
printf '$ {BASH_REMATCH [i]}, '
darīts
izmest ārā

Rezultāts ir šāds:

atrasts
skatuves dejotāja, dejotāja,

Visa grupa ir skatuves dejotāja. Ir tikai viena apakšgrupa, kas ir dejotāja.

Piezīme: atstarpe rakstā ir atbrīvota.

Lielo/mazo burtu neatkarības atbilstība

Atbilstība, kā paskaidrots iepriekš, ir reģistrjutīga. Saskaņošanu var veikt neatkarīgi no lietas. Tas ir parādīts šādā kodā:

veikali -snocasematch

lpp='Mums patīk laba mūzika.'
ja [[ $ str= ~ GoOd]];tad
izmest ārāatrasts
būt

veikali -unocasematch

Rezultāts ir: atrasts. Modelis ir, GoOd. Atbilstošā apakšvirkne ir “laba”. Ievērojiet, kā opcija nocasematch ir iespējota koda segmenta sākumā un atspējota koda segmenta beigās.

Stīgas garums

Virknes garuma iegūšanas sintakse ir šāda:

$ {#PARAMETER}

Piemērs:

lpp='Mums patīk laba mūzika.'
izmest ārā $ {# str}

Rezultāts ir: 19.

Stīgu samazināšana

Virkņu samazināšanas sintakse ir šāda:

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

kur nobīde sākas no nulles.

Šis piemērs parāda, kā noņemt virknes pirmās 11 rakstzīmes:

lpp='Es vienmēr dejoju labas mūzikas pavadījumā.'
izmest ārā $ {str: 10}

Rezultāts ir šāds:

laba mūzika.

Tiek skaitīts LENGTH, sākot ar nākamo rakstzīmi. Šis kods parāda, kā virknes daļu var atļaut:

lpp='Es vienmēr dejoju labas mūzikas pavadījumā.'
izmest ārā $ {str: 10: 6}

Rezultāts ir šāds:

ance t

Pirmās 11 rakstzīmes tika noņemtas; tika atļautas nākamās 6 rakstzīmes, bet pārējās rakstzīmes tika automātiski noņemtas.

Meklēt un aizstāt

Kad tiek atrasta apakšvirkne, to var aizstāt ar citu apakšvirkni. Tam sintakses ir šādas:

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

Pirmajai sintaksei ar vienu slīpsvītru uz priekšu tiek aizstāta tikai pirmā atbilstība. Piemērs:

lpp='Kamerā ir žurka, sikspārnis un kaķis.'
taisnība=$ {str/[cbr] pie/liela govs}
izmest ārā $ str
izmest ārā $ ret

Rezultāts ir šāds:

Kamerā ir žurka, sikspārnis un kaķis.
Kamerā ir liela govs, sikspārnis un kaķis.

Otrajai sintaksei ar dubultām slīpsvītrām uz priekšu visi spēles gadījumi tiek aizstāti. Piemērs:

lpp='Kamerā ir žurka, sikspārnis un kaķis.'
taisnība=$ {str // [cbr] at/liela govs}
izmest ārā $ str
izmest ārā $ ret

Rezultāts ir šāds:

Kamerā ir žurka, sikspārnis un kaķis.
Kamerā ir liela govs, liela govs un liela govs.

Trešajai sintaksei ar vienu slīpsvītru uz priekšu netiek aizstāta pirmā un vienīgā spēle.

Tiek dzēsta arī pirmā atrastā apakšvirkne. Piemērs:

lpp='Kamerā ir žurka, sikspārnis un kaķis.'
taisnība=$ {str/[cbr] plkst.}
izmest ārā $ str
izmest ārā $ ret

Ceturtajai sintaksei ar dubultām slīpsvītrām uz priekšu, visas spēles nevar aizstāt. Turklāt visas atrastās apakšvirknes tiek dzēstas. Piemērs:

lpp='Kamerā ir žurka, sikspārnis un kaķis.'
taisnība=$ {str // [cbr] plkst.}
izmest ārā $ str
izmest ārā $ ret

Rezultāts ir šāds:

Kamerā ir žurka, sikspārnis un kaķis.
Kamerā ir a, a un a.

Secinājums

Lai pārbaudītu, vai virknei Bash ir apakšvirkne, ir jāizmanto Pattern Matching. Pattern Matching notiek ne tikai dubultās iekavās, [[. . . ]]. Tas var notikt arī parametru paplašināšanā, izmantojot $ {. . .}. Izmantojot parametru paplašināšanu, ir iespējams iegūt apakšvirkni pēc indeksiem.

Šajā rakstā izklāstītie ir vissvarīgākie modeļu saskaņošanas punkti. Ir vairāk! Tomēr lasītājam vajadzētu izpētīt nākamo, ir faila nosaukuma paplašināšana.