Ako skontrolovať, či reťazec obsahuje podreťazec v bashe

How Check If String Contains Substring Bash



Otázkou je, ako skontrolovať, či reťazec obsahuje podreťazec v Bash. Odpoveď je: použite Pattern Matching. Z toho pramení ďalšia otázka, ktorá znie: Čo je to Pattern Matching? Fráza vo vete má určité vlastnosti. Preto sa líši od ostatných fráz v tej istej vete alebo v iných vetách. Charakteristiky môžu byť kódované ako vzor. Takýmto spôsobom je možné identifikovať konkrétnu frázu v reťazci. Tento článok vysvetľuje, ako identifikovať konkrétny podreťazec vo väčšom reťazci, nahradiť podreťazec zhodný s iným podreťazcom a vyhľadať všetky podreťazce vo väčšom reťazci podľa indexu. Pred ponorením sa do vysvetlení si však musíte pripomenúť rôzne spôsoby, ako je v Bash vytvorený reťazec.

Reťazec unikajúcich priestorov

Reťazec je možné zostrojiť tak, že každý priestor nahradíte sekvenciou úniku z priestoru, „“; ako v:







myVar= Cestovný ruch v Egypt je jeden z krajiny krajiny 's vedúcimi ekonomickými priemyselnými odvetviami.
zahodil $ myVar

Výstupom je:



Egyptský turizmus je jedným z popredných ekonomických odvetví krajiny.



Poznámka: apostrof použil aj sekvenciu úniku z vesmíru.





Reťazec v jednoduchých úvodzovkách

Má programátor čas uniknúť zo všetkých medzier v reťazci? Nie. Preto je lepšie použiť dva jednoduché úvodzovky na oddelenie reťazca; ako napríklad:

myVar=„Cestovný ruch v Egypte je jednou z krajín“ 'je popredným ekonomickým odvetvím. '

Reťazec s jednou citáciou neumožňuje rozšírenie (nahradenie jeho účinkom) žiadnej sekvencie úniku. Našťastie, ak sú dva reťazce kódované vedľa seba, budú brané ako jeden reťazec. Medzi nimi je možné vložiť únikovú sekvenciu, ako je uvedené vyššie. Úniková sekvencia by bola rozšírená. Výstupom sa teda stane:



Egyptský turizmus je jedným z popredných ekonomických odvetví krajiny.

Reťazec v dvojitých úvodzovkách

Pri dvojitých úvodzovkách sa nerozbalia ani únikové sekvencie, ale rozšíria sa premenné. Nasledujúci kód to ilustruje:

myVar= Cestovný ruch v Egypt je jeden z krajiny krajiny 's vedúcimi ekonomickými priemyselnými odvetviami.
zahodil $ myVar

Výstupom je:

Egyptský turizmus je jedným z popredných ekonomických odvetví krajiny.

Poznámka: apostrof použil aj sekvenciu úniku z vesmíru.

V tomto článku je hlavným uvažovaným reťazcom reťazec v jednoduchých úvodzovkách.

Základy regulárneho výrazu

Regulárny výraz

Zvážte tento reťazec:

Tento svet nie je skutočne naším domovom.

Podreťazcom záujmu nech je svet. Potom sa veľký reťazec (celý reťazec) nazýva cieľový reťazec alebo jednoducho cieľ. „Svet“ v úvodzovkách sa nazýva regulárny výraz alebo jednoducho regulárny výraz. Obsah, svet, je v tomto prípade vzorom.

Jednoduché párovanie

Ak v nasledujúcom kóde nájdete v cieli slovo „svet“, povedali by sme, že sa slovo zhodovalo.

p='Tento svet nie je v skutočnosti naším domovom.'
reg='svet'
keby [[ $ str= ~$ reg ]];potom
zahodilnájdené
inak
zahodilnenájdené
byť

= ~, čo je operátor priradenia, za ktorým nasleduje ~, sa nazýva operátor väzby. Podmienka kontroluje, či je vzor zhodný s cieľovým reťazcom. Ak sa v cieli nachádza podreťazec zodpovedajúci vzoru, príkaz ozveny sa zobrazí ako nájdený. Ak sa nenájde, vyhlásenie ozveny sa neozve. Výstupom pre tento kód je:

nájdené

Vzorec, svet, sa nachádza v cieli. Všimnite si toho, že oddeľovací priestor po [[a pred]] bol zachovaný.

Vzor

Vo vyššie uvedenom kóde je „svet“ v úvodzovkách regexom, zatiaľ čo svet samotný je vzorom. Toto je priamy vzor. Väčšina vzorov však nie je taká jednoduchá. Vzor je charakterizácia podreťazca, ktorý sa má nájsť. Bashov vzor teda používa určité metaznaky. Metacharakter je postava o iných postavách. Bash Pattern napríklad používa nasledujúce metaznaky:

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

Regulárny výraz je možné zadať aj do dvojitých zátvoriek podmienky. Nemusí to však byť v úvodzovkách. V tomto prípade ide teda doslova o vzor.

Triedy postáv

Hranaté zátvorky

Našiel sa výstup z nasledujúceho kódu, čo znamená, že došlo k zhode:

p=„Mačka vošla do komory.“
keby [[ $ str= ~[cbr]o]];potom
zahodilnájdené
byť

Vzorec [cbr] at zodpovedá mačke, ktorá začína na „c“ a pokračuje a končí na. [cbr] znamená, zhoda „c“ alebo „b“ alebo „r“, za ktorou nasleduje.

Našiel sa výstup z nasledujúceho kódu, čo znamená, že došlo k zhode:

p='Netopier prišiel do komory.'
keby [[ $ str= ~[cbr]o]];potom
zahodilnájdené
byť

Vzorec [cbr] at sa zhoduje s netopierom, ktorý začína na „b“ a ktorý pokračuje a končí na. [cbr] znamená, zhoda „c“ alebo „b“ alebo „r“, za ktorou nasleduje.

Našiel sa výstup z nasledujúceho kódu, čo znamená, že došlo k zhode:

p='Potkan prišiel do komory.'
keby [[ $ str= ~[cbr]o]];potom
zahodilnájdené
byť

Vzorec [cbr] at sa zhoduje s potkanmi, ktorý začína na „r“ a ktorý pokračuje a končí na.

Vo vyššie uvedených ukážkach kódu programátor nevie, či sa v cieľovom reťazci nachádza mačka alebo netopier alebo potkan. Vie však, že podreťazec začína buď „c“ alebo „b“ alebo „r“, potom pokračuje a končí sa na. Hranaté zátvorky vo vzore umožňujú rôznym možným znakom priradiť jeden znak k pozícii relatívne k iným v cieli. Hranaté zátvorky teda obsahujú množinu znakov, z ktorých jeden je priradený k podreťazcu. Nakoniec je to zhodný celý podreťazec.

Rozsah postáv

Vo vyššie uvedenom kóde [cbr] je trieda. Aj keď „c“ alebo „b“ alebo „r“ zodpovedá jednému znaku, v prípade, že sa nasledujúci text bezprostredne nezhoduje, vzor sa nebude zhodovať s ničím.

Existujú určité rozsahy, ktoré vytvoria triedu. Napríklad triedu tvorí 0 až 9 číslic, [0-9] vrátane 0 a 9. Malé písmena „a“ až „z“ tvoria triedu [a-z] vrátane „a“ a „z“. Veľké písmena „A“ až „Z“ tvoria triedu [A-Z], vrátane „A“ a „Z“. Z triedy je to jeden zo znakov, ktoré by zodpovedali jednému znaku v reťazci.

Nasledujúci kód vytvára zhodu:

keby [[ 'ID8id'= ~[0-9] ]];potom
zahodilnájdené
byť

Tentokrát je cieľom doslovný reťazec v podmienke. 8, čo je jedno z možných čísel v rámci rozsahu [0-9], zodpovedalo 8 v reťazci „ID8id“. Vyššie uvedený kód je ekvivalentný:

keby [[ 'ID8id'= ~[0123456789] ]];potom
zahodilnájdené
byť

Tu sú do vzoru zapísané všetky možné čísla, takže neexistuje spojovník.

V nasledujúcom kóde sa získa zhoda:

keby [[ „ID8iD“= ~[a-z] ]];potom
zahodilnájdené
byť

Zhoda je medzi malými „i“ v rozsahu, [a-z] a malými „i“ v cieľovom reťazci, „ID8iD“.

Nezabudnite: rozsah je trieda. Trieda môže byť súčasťou väčšieho vzoru. Text teda môže byť pred triedou alebo po nej. Nasledujúci kód to ilustruje:

keby [[ „ID8id je identifikátor“= ~ ID[0-9]id ]];potom
zahodilnájdené
byť

Výstup je: nájdený. „ID8id“ zo vzoru sa zhoduje s „ID8id“ v cieľovom reťazci.

Negácia

Zhoda sa nezískava z nasledujúceho kódu:

keby [[ „0123456789101112“= ~[^0-9] ]];potom
zahodilnájdené
inak
zahodilnenájdené
byť

Výstupom je:

nenájdené

Bez ^ pred rozsahom, v hranatých zátvorkách, by sa nula rozsahu zhodovala s prvou nulou cieľového reťazca. ^ Pred rozsahom (alebo voliteľnými znakmi) teda neguje triedu.

Nasledujúci kód vytvára zhodu, pretože podmienka znie: zhodujte ľubovoľné neciferné znaky kdekoľvek v cieli:

keby [[ „ABCDEFGHIJ“= ~[^0-9] ]];potom
zahodilnájdené
inak
zahodilnenájdené
byť

Výstup je teda: nájdený.

[^0-9] znamená neciferné číslo, takže [^0-9] je negáciou [0-9].

[^a-z] znamená malé písmeno, takže [^a-z] je negáciou [a-z].

[^A-Z] znamená nie veľké písmeno, takže [^A-Z] je negáciou [A-Z].

K dispozícii sú ďalšie negácie.

Obdobie (.) Vo vzore

Bodka (.) Vo vzore sa zhoduje s akýmkoľvek znakom vrátane neho. Zvážte nasledujúci kód:

keby [[ „6759WXY.A3“= ~ 7,9 W.Y.A]];potom
zahodilnájdené
byť

Výstup kódu je nájdený, pretože ostatné znaky sa zhodujú. Jedna bodka sa zhoduje s „5“; ďalšia bodka sa zhoduje s „X“; a posledná bodka sa zhoduje s bodkou.

Zodpovedajúca alternácia

Zvážte túto vetu pre cieľový reťazec:

V klietke sú vtáky rôznych typov.

Niekto môže chcieť vedieť, či má tento cieľ holuba, páva alebo orla. Môžete použiť nasledujúci kód:

p='Klietka má pávy rôznych typov.'
keby [[ $ str= ~ holub|páv|orol]];potom
zahodilnájdené
inak
zahodilnenájdené
byť

Výstup je, nájdený. Metacharakter alternácie, | bol zamestnaný. Môžu existovať dve, tri, štyri a viac alternatív. Čo sa v tomto kóde zhoduje, je „páv“.

Zoskupovanie

V nasledujúcom vzore boli na zoskupenie znakov použité zátvorky:

pódium (tanečník)

Táto skupina je scénická tanečnica obklopená metaznakmi (a). (tanečník) je podskupina, zatiaľ čo pódium (tanečník) je celá skupina. Zvážte nasledujúce:

(Tanečník je úžasný)

Tu je podskupina alebo podreťazec tanečník úžasný.

Podložky so spoločnými časťami

Zainteresovaná strana je osoba, ktorá má záujem o podnik. Predstavte si firmu s webovou stránkou stake.com. Predstavte si, že je v počítači jeden z nasledujúcich cieľových reťazcov:

Webová stránka stake.com je určená pre firmy .;

Je tu zainteresovaná strana .;

Zainteresovaná strana pracuje pre stake.com .;

Nech je cieľom ktorýkoľvek z týchto reťazcov. Programátor môže chcieť vedieť, či je stake.com alebo stakeholder v akomkoľvek cieľovom reťazci. Jeho vzorec by bol:

stake.com | stakeholder

pomocou striedania.

stávka bola do týchto dvoch slov zadaná dvakrát. Tomu sa dá vyhnúť zadaním vzoru nasledovne:

podiel (.com | držiteľ)

.com | držiteľ je v tomto prípade podskupinou.

Poznámka: v tomto prípade použite alternačný znak. stake.com alebo stakeholder sa bude stále hľadať. Nájde sa výstup z nasledujúceho kódu:

p='Webová stránka stake.com je určená pre firmy.'
keby [[ $ str= ~ podiel(.s|držiak) ]];potom
zahodilnájdené
byť

Podreťazcom, ktorý sa tu zhoduje, je stake.com.

Preddefinované pole BASH_REMATCH

BASH_REMATCH je preddefinované pole. Predpokladajme, že vzor má skupiny. Celá skupina sa zhoduje, ide do bunky pre index 0 tohto poľa. Prvá podskupina sa zhoduje, ide do bunky pre index 1; druhá podskupina sa zhodovala, ide do bunky pre index 2 atď. Nasledujúci kód ukazuje, ako používať toto pole:

p='Prišiel pódiový tanečník.'
keby [[ $ str= ~ fáza (tanečník) ]];potom
zahodilnájdené
byť

preiv $ {! BASH_REMATCH [@]};urobiť
printf '$ {BASH_REMATCH [i]}, '
hotový
zahodil

Výstupom je:

nájdené
pódiový tanečník, tanečník,

Celá skupina je scénická tanečnica. Existuje iba jedna podskupina, ktorou je tanečník.

Poznámka: priestor vo vzore bol uniknutý.

Zhoda veľkých a malých písmen nezávislosti

Pri párovaní, ako je vysvetlené vyššie, sa rozlišujú malé a veľké písmená. Priradenie je možné vykonať nezávisle od prípadu. Ilustruje to nasledujúci kód:

obchody -snocasematch

p='Máme radi dobrú hudbu.'
keby [[ $ str= ~ GoOd]];potom
zahodilnájdené
byť

obchody -unocasematch

Výstup je: nájdený. Vzorec je GoOd. Zhodný podreťazec je „dobrý“. Všimnite si toho, ako bola možnosť nocasematch povolená na začiatku segmentu kódu a zakázaná na konci segmentu kódu.

Dĺžka reťazca

Syntax na získanie dĺžky reťazca je:

$ {#PARAMETER}

Príklad:

p='Máme radi dobrú hudbu.'
zahodil $ {# str}

Výstup je: 19.

Redukcia strún

Syntaxe na zníženie reťazca sú:

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

kde počítanie pre OFFSET začína od nuly.

Nasledujúci príklad ukazuje, ako odstrániť prvých 11 znakov reťazca:

p='Vždy tancujem na dobrú hudbu.'
zahodil $ {str: 10}

Výstupom je:

k dobrej hudbe.

Počítanie na DĹŽKU začína od ďalšej postavy. Nasledujúci kód ukazuje, ako je možné povoliť časť v reťazci:

p='Vždy tancujem na dobrú hudbu.'
zahodil $ {str: 10: 6}

Výstupom je:

ance t

Prvých 11 znakov bolo odstránených; bolo povolených ďalších 6 znakov a ostatné znaky boli automaticky odstránené.

Hľadať a nahradiť

Keď sa nájde podreťazec, môže byť nahradený iným podreťazcom. Syntaxe pre toto sú:

kde={PARAMETER/VZOR/VÝMENA} $
kde=$ {PARAMETER // VZOR/VÝMENA}
kde={PARAMETER/VZOR} $
kde=$ {PARAMETER // PATTERN}

Pri prvej syntaxi s jednoduchou lomkou sa nahradí iba prvá zhoda. Príklad:

p='V komore je krysa, netopier a mačka.'
správny=$ {str/[cbr] pri/big cow}
zahodil $ str
zahodil $ ret

Výstupom je:

V komore je krysa, netopier a mačka.
V komore je veľká krava, netopier a mačka.

Pri druhej syntaxi s dvojitými lomkami sa nahradia všetky výskyty zhody. Príklad:

p='V komore je krysa, netopier a mačka.'
správny=$ {str // [cbr] at/big cow}
zahodil $ str
zahodil $ ret

Výstupom je:

V komore je krysa, netopier a mačka.
V komore je veľká krava, veľká krava a veľká krava.

Pre tretiu syntax s jedinou lomkou nie je možné nahradiť prvú a jedinú zhodu.

Tiež sa odstráni prvý nájdený podreťazec. Príklad:

p='V komore je krysa, netopier a mačka.'
správny=$ {str/[cbr] o}
zahodil $ str
zahodil $ ret

Za štvrtú syntax s dvojitými lomkami vpred neexistuje náhrada za všetky zápasy. Tiež sa odstránia všetky nájdené podreťazce. Príklad:

p='V komore je krysa, netopier a mačka.'
správny=$ {str // [cbr] o}
zahodil $ str
zahodil $ ret

Výstupom je:

V komore je krysa, netopier a mačka.
V komore je a, a a a.

Záver

Aby bolo možné skontrolovať, či reťazec obsahuje podreťazec v jazyku Bash, je potrebné použiť párovanie vzorov. Zhoda vzorov neprebieha iba v dvojitých zátvorkách s podmienkami, [[[. . . ]]. Môže sa uskutočniť aj v rozšírení parametrov s jeho $ {. . .}. S rozšírením parametrov je možné získať podreťazec podľa indexov.

To, čo bolo uvedené v tomto článku, sú najdôležitejšími bodmi priraďovania vzorov. Je ich viac! Čo by si však čitateľ mal naštudovať ďalej, je Rozšírenie názvu súboru.