Jak zkontrolovat, zda řetězec obsahuje podřetězec v Bash

How Check If String Contains Substring Bash



Otázkou je, jak zkontrolovat, zda řetězec obsahuje podřetězec v Bash. Odpověď zní: použijte Pattern Matching. Z toho plyne další otázka, která zní: co je to Pattern Matching? Fráze ve větě má určité vlastnosti. Proto se liší od ostatních frází ve stejné větě nebo v jiných větách. Charakteristiky lze kódovat jako vzor. Tímto způsobem lze určit konkrétní frázi v řetězci. Tento článek vysvětluje, jak identifikovat konkrétní podřetězec ve větším řetězci, nahradit podřetězec odpovídající jinému podřetězci a vyhledat jakýkoli podřetězec ve větším řetězci podle indexu. Než se však ponoříte do vysvětlení, musíte si připomenout různé způsoby, jak je v Bash zaveden řetězec.

Řetězec Escaping Spaces

Řetězec lze sestrojit tak, že každý prostor nahradíte sekvencí úniku z prostoru, ‘‘; jako v:







myVar= Cestovní ruch v Egypt je jedním ze země 's předními ekonomickými průmysly.
vyhodil $ myVar

Výstupem je:



Egyptský cestovní ruch je jedním z hlavních hospodářských odvětví v zemi.



Poznámka: apostrof také použil sekvenci úniku z vesmíru.





Řetězec v jednoduchých uvozovkách

Má programátor čas uniknout všem mezerám v řetězci? Ne. Proto je lepší použít dva jednoduché uvozovky k oddělení řetězce; jako:

myVar=„Cestovní ruch v Egyptě je jednou ze zemí“ 'je předním hospodářským odvětvím. '

Řetězec s jednoduchou uvozovkou neumožňuje rozšíření (nahrazení jeho účinkem) jakékoli únikové sekvence. Naštěstí pokud jsou dva řetězce kódovány vedle sebe, budou brány jako jeden řetězec. Mezi nimi lze vložit únikovou sekvenci, jak je uvedeno výše. Úniková sekvence by byla rozšířena. Výstupem se tedy stává:



Egyptský cestovní ruch je jedním z hlavních hospodářských odvětví v zemi.

Řetězec v uvozovkách

U uvozovek se také nerozbalí únikové sekvence, ale rozšíří se proměnné. Následující kód to ilustruje:

myVar= Cestovní ruch v Egypt je jedním ze země 's předními ekonomickými průmysly.
vyhodil $ myVar

Výstupem je:

Egyptský cestovní ruch je jedním z hlavních hospodářských odvětví v zemi.

Poznámka: apostrof také použil sekvenci úniku z vesmíru.

V tomto článku je hlavním typem uvažovaného řetězce řetězec v jednoduchých uvozovkách.

Základy regulárního výrazu

Regex

Zvažte tento řetězec:

Tento svět ve skutečnosti není naším domovem.

Nechť je svět podřetězcem zájmu. Potom se velký řetězec (celý řetězec) nazývá cílový řetězec nebo jednoduše cíl. „Svět“ v uvozovkách se nazývá regulární výraz nebo jednoduše regex. Obsah, svět, je v tomto případě vzorem.

Jednoduché párování

Pokud by v následujícím kódu bylo v cíli nalezeno slovo „svět“, řekli bychom, že se slovo shodovalo.

p='Tento svět opravdu není naším domovem.'
reg='svět'
-li [[ $ str= ~$ reg ]];pak
vyhodilnalezeno
jiný
vyhodilnenalezeno
být

= ~, což je operátor přiřazení následovaný ~, se nazývá operátor vazby. Podmínka kontroluje, zda je vzor shodný s cílovým řetězcem. Pokud je v cíli nalezen podřetězec odpovídající vzoru, zobrazí se příkaz echo nalezen. Pokud není nalezen, ozvěna ozvěny není nalezena. Výstupem pro tento kód je:

nalezeno

Jako vzor, ​​svět, se nachází v cíli. Všimněte si toho, že mezera po [[a před]] byla zachována.

Vzor

Ve výše uvedeném kódu je „svět“ v uvozovkách regex, zatímco svět samotný je vzor. Toto je přímočarý vzorec. Většina vzorů však není tak jednoduchá. Vzor je charakterizace nalezeného podřetězce. A tak vzor Bash používá určité metaznaky. Metacharakter je postava o jiných postavách. Bash Pattern například používá následující metaznaky:

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

Do dvojitých závorek podmínky lze také zadat regulární výraz. V uvozovkách to ale být nemusí. V tomto případě jde tedy doslova o vzor.

Třídy postav

Hranaté závorky

Je nalezen výstup následujícího kódu, což znamená, že došlo k shodě:

p='Kočka přišla do komory.'
-li [[ $ str= ~[cbr]na]];pak
vyhodilnalezeno
být

Vzor, [cbr] at se shoduje s kočkou, která začíná na „c“ a která pokračuje a končí na. [cbr] znamená, shoda „c“ nebo „b“ nebo „r“ následovaná at.

Je nalezen výstup následujícího kódu, což znamená, že došlo k shodě:

p='Netopýr přišel do komory.'
-li [[ $ str= ~[cbr]na]];pak
vyhodilnalezeno
být

Vzor, [cbr] at má uzavřenou pálku, která začíná na „b“ a která pokračuje a končí na. [cbr] znamená, shoda „c“ nebo „b“ nebo „r“ následovaná at.

Je nalezen výstup následujícího kódu, což znamená, že došlo k shodě:

p='Krysa přišla do komory.'
-li [[ $ str= ~[cbr]na]];pak
vyhodilnalezeno
být

Vzor, [cbr] at odpovídá krysě, která začíná na „r“ a která pokračuje a končí na.

Ve výše uvedených ukázkách kódu programátor neví, zda v cílovém řetězci existuje kočka nebo netopýr nebo krysa. Ví však, že podřetězec začíná buď „c“ nebo „b“ nebo „r“, poté pokračuje a končí na. Hranaté závorky ve vzoru umožňují různým možným znakům, aby se shodovaly s jedním znakem na pozici relativně k ostatním v cíli. Hranaté závorky tedy obsahují sadu znaků, z nichž jeden odpovídá podřetězci. Nakonec se shoduje celý podřetězec.

Rozsah postav

Ve výše uvedeném kódu [cbr] je třída. I když „c“ nebo „b“ nebo „r“ odpovídá jednomu znaku, pokud se v tomto případě bezprostředně neshoduje, vzor nebude odpovídat ničemu.

Existují určité rozsahy, které vytvoří třídu. Například třídu tvoří 0 až 9 číslic, [0-9] včetně 0 a 9. Malá písmena „a“ až „z“ tvoří třídu [a-z], včetně „a“ a „z“. Velká písmena „A“ až „Z“ tvoří třídu [A-Z], včetně „A“ a „Z“. Ze třídy je to jeden ze znaků, které by odpovídaly jednomu znaku v řetězci.

Následující kód vytvoří shodu:

-li [[ 'ID8id'= ~[0-9] ]];pak
vyhodilnalezeno
být

Tentokrát je cílem doslovný řetězec v podmínce. 8, což je jedno z možných čísel v rozsahu [0-9], odpovídá 8 v řetězci „ID8id“. Výše uvedený kód je ekvivalentní:

-li [[ 'ID8id'= ~[0123456789] ]];pak
vyhodilnalezeno
být

Zde byla do vzoru zapsána všechna možná čísla, takže zde není spojovník.

V následujícím kódu se získá shoda:

-li [[ 'ID8iD'= ~[a-z] ]];pak
vyhodilnalezeno
být

Shoda je mezi malými „i“ v rozsahu, [a-z] a malými „i“ cílového řetězce, „ID8iD“.

Pamatujte: rozsah je třída. Třída může být součástí většího vzoru. Ve vzoru tedy může být text před a/nebo za třídou. Následující kód to ilustruje:

-li [[ „ID8id je identifikátor“= ~ ID[0-9]id ]];pak
vyhodilnalezeno
být

Výstup je: found. „ID8id“ ze vzoru odpovídá „ID8id“ v cílovém řetězci.

Negace

Shoda není získána z následujícího kódu:

-li [[ '0123456789101112'= ~[^0-9] ]];pak
vyhodilnalezeno
jiný
vyhodilnenalezeno
být

Výstupem je:

nenalezeno

Bez ^ před rozsahem, v hranatých závorkách, by nula rozsahu odpovídala první nule cílového řetězce. Takže ^ před rozsahem (nebo volitelnými znaky) neguje třídu.

Následující kód vytvoří shodu, protože podmínka zní: shoda libovolného neciferného znaku kdekoli v cíli:

-li [[ 'ABCDEFGHIJ'= ~[^0-9] ]];pak
vyhodilnalezeno
jiný
vyhodilnenalezeno
být

Výstup je tedy: found.

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

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

[^A-Z] znamená malé písmeno, takže [^A-Z] je negací [A-Z].

K dispozici jsou další negace.

Období (.) Ve vzoru

Perioda (.) Ve vzoru odpovídá libovolnému znaku včetně sebe. Zvažte následující kód:

-li [[ '6759WXY.A3'= ~ 7,9W.Y.A]];pak
vyhodilnalezeno
být

Výstup kódu je nalezen, protože ostatní znaky se shodují. Jedna tečka odpovídá „5“; další tečka odpovídá „X“; a poslední tečka odpovídá tečce.

Odpovídající alternace

Zvažte tuto větu pro cílový řetězec:

V kleci jsou ptáci různých typů.

Někdo může chtít vědět, zda tento cíl má holuba, páva nebo orla. Lze použít následující kód:

p='Klec má pávy různých typů.'
-li [[ $ str= ~ holub|páv|orel]];pak
vyhodilnalezeno
jiný
vyhodilnenalezeno
být

Výstup je, nalezen. Metacharakter alternace, | byl zaměstnán. Mohou existovat dvě, tři, čtyři a více alternativ. Tomuto kódu odpovídá „páv“.

Seskupení

V následujícím vzoru byly ke seskupení znaků použity závorky:

pódium (tanečník)

Tato skupina je jevištní tanečnice obklopená metaznaky (a). (tanečník) je podskupina, zatímco scéna (tanečník) je celá skupina. Zvažte následující:

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

Zde je podskupina nebo podřetězec tanečník úžasný.

Podřetězce se společnými součástmi

Zúčastněná strana je osoba se zájmem o podnikání. Představte si firmu s webovou stránkou stake.com. Představte si, že je v počítači jeden z následujících cílových řetězců:

Web, stake.com je pro podnikání .;

Je tu stakeholder .;

Zainteresovaná strana pracuje pro stake.com .;

Ať je cílem kterýkoli z těchto řetězců. Programátor může chtít vědět, zda je stake.com nebo stakeholder v jakémkoli cílovém řetězci. Jeho vzorec by byl:

stake.com | stakeholder

pomocí střídání.

sázka byla ve dvou slovech napsána dvakrát. Tomu se lze vyhnout zadáním vzoru následujícím způsobem:

podíl (.com | držitel)

Držitel .com | je v tomto případě podskupinou.

Poznámka: použití alternačního znaku v tomto případě. stake.com nebo stakeholder budou nadále prohledávány. Je nalezen výstup následujícího kódu:

p='Webová stránka stake.com je určena pro podnikání.'
-li [[ $ str= ~ sázka(.s|držák) ]];pak
vyhodilnalezeno
být

Zde odpovídajícím podřetězcem je stake.com.

Předdefinované pole BASH_REMATCH

BASH_REMATCH je předdefinované pole. Předpokládejme, že vzor má skupiny. Celá skupina odpovídá, jde do buňky pro index 0 tohoto pole. První podskupina odpovídá, jde do buňky pro index 1; druhá podskupina odpovídá, jde do buňky pro index 2 atd. Následující kód ukazuje, jak použít toto pole:

p='Přišel pódiový tanečník.'
-li [[ $ str= ~ fáze (tanečník) ]];pak
vyhodilnalezeno
být

prov $ {! BASH_REMATCH [@]};dělat
printf '$ {BASH_REMATCH [i]}'
Hotovo
vyhodil

Výstupem je:

nalezeno
pódiový tanečník, tanečník,

Celá skupina je pódiová tanečnice. Existuje pouze jedna podskupina, kterou je tanečník.

Poznámka: místo ve vzoru bylo uniknuto.

Shoda nezávislosti velkých/malých písmen

Při hledání shody, jak bylo vysvětleno výše, se rozlišují velká a malá písmena. Shoda může být provedena nezávisle na případu. To je znázorněno v následujícím kódu: This is illustrated in the following code:

obchody -snocasematch

p='Máme rádi dobrou hudbu.'
-li [[ $ str= ~ GoOd]];pak
vyhodilnalezeno
být

obchody -unocasematch

Výstup je: found. Vzorec je, GoOd. Odpovídající podřetězec je „dobrý“. Všimněte si, jak byla možnost nocasematch povolena na začátku segmentu kódu a zakázána na konci segmentu kódu.

Délka řetězce

Syntaxe pro získání délky řetězce je:

$ {#PARAMETER}

Příklad:

p='Máme rádi dobrou hudbu.'
vyhodil $ {# str}

Výstup je: 19.

Redukce strun

Syntaxe pro redukci řetězců jsou:

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

kde počítání pro OFFSET začíná od nuly.

Následující příklad ukazuje, jak odebrat prvních 11 znaků řetězce:

p='Vždycky tančím na dobrou hudbu.'
vyhodil $ {str: 10}

Výstupem je:

k dobré hudbě.

Počítání na DÉLKU začíná od dalšího znaku. Následující kód ukazuje, jak lze povolit část v řetězci:

p='Vždycky tančím na dobrou hudbu.'
vyhodil $ {str: 10: 6}

Výstupem je:

ance t

Prvních 11 znaků bylo odstraněno; bylo povoleno dalších 6 znaků a ostatní znaky byly automaticky odstraněny.

Hledat a nahradit

Když je nalezen podřetězec, může být nahrazen jiným podřetězcem. Syntaxe pro toto jsou:

kde=$ {PARAMETER/VZOR/VÝMĚNA}
kde=$ {PARAMETER // VZOR/VÝMĚNA}
kde=$ {PARAMETER/PATTERN}
kde=$ {PARAMETER // PATTERN}

U první syntaxe s jediným lomítkem se nahradí pouze první shoda. Příklad:

p='V komnatě je krysa, netopýr a kočka.'
že jo=$ {str/[cbr] na/velká kráva}
vyhodil $ str
vyhodil $ ret

Výstupem je:

V komoře je krysa, netopýr a kočka.
V komoře je velká kráva, netopýr a kočka.

U druhé syntaxe s dvojitými lomítky jsou nahrazeny všechny výskyty shody. Příklad:

p='V komnatě je krysa, netopýr a kočka.'
že jo=$ {str // [cbr] at/big cow}
vyhodil $ str
vyhodil $ ret

Výstupem je:

V komoře je krysa, netopýr a kočka.
V komoře je velká kráva, velká kráva a velká kráva.

U třetí syntaxe s jedním lomítkem vpřed neexistuje náhrada za první a jedinou shodu.

Odstraní se také první nalezený podřetězec. Příklad:

p='V komnatě je krysa, netopýr a kočka.'
že jo=$ {str/[cbr] v}
vyhodil $ str
vyhodil $ ret

Čtvrtá syntaxe s dvojitými lomítky dopředu nenahrazuje všechny zápasy. Rovněž budou odstraněny všechny nalezené podřetězce. Příklad:

p='V komnatě je krysa, netopýr a kočka.'
že jo=$ {str // [cbr] v}
vyhodil $ str
vyhodil $ ret

Výstupem je:

V komoře je krysa, netopýr a kočka.
V komoře je a, a a a.

Závěr

Aby bylo možné zkontrolovat, zda řetězec obsahuje podřetězec v Bash, musí být použit Pattern Matching. Shoda vzorů neprobíhá pouze ve dvojitých závorkách podmínky, [[. . . ]]. Může také probíhat v rozšíření parametrů s jeho $ {. . .}. S rozšířením parametrů je možné získat podřetězec pomocí indexů.

To, co bylo představeno v tomto článku, jsou nejkritičtějšími body při porovnávání vzorů. Je jich víc! Co by si však čtenář měl dále prostudovat, je Rozšíření názvu souboru.