Как да проверите дали низ съдържа подниза в Bash

How Check If String Contains Substring Bash



Въпросът е как да проверим дали низ съдържа подниза в Bash. Отговорът е: използвайте Pattern Matching. Това поражда друг въпрос, който е: какво е Pattern Matching? Е, една фраза в изречение има определени характеристики. Ето защо той се различава от другите фрази в същото изречение или в други изречения. Характеристиките могат да бъдат кодирани като модел. По този начин може да се идентифицира определена фраза в низ. Тази статия обяснява как да идентифицирате определена подниза в по -голям низ, да замените подниза, съчетана с друга подниза, и да намерите всяка подниза в по -голям низ по индекс. Въпреки това, преди да се потопите в обясненията, човек трябва да си припомни различните начини за установяване на низ в Bash.

Низ чрез избягващи пространства

Низ може да бъде конструиран чрез замяна на всяко интервал с последователност за избягване на интервал, „“; както в:







myVar= Туризъм в Египет е една от страната 's водещи икономически индустрии.
изхвърлен $ myVar

Изходът е:



Туризмът в Египет е една от водещите икономически индустрии в страната.



Забележка: апострофът също използва последователността за бягство от пространството.





Низ по единични кавички

Има ли програмистът време да избяга от всички интервали в низ? Не. Следователно използването на две единични кавички за разграничаване на низ е по -добре; като:

myVar=„Туризмът в Египет е една от страните“ 'е водеща икономическа индустрия. “

Низ с единични кавички не позволява разширяването (заместването с неговия ефект) на която и да е бягаща последователност. За щастие, ако два низа са кодирани един до друг, те ще бъдат взети като един низ. Евакуационна последователност може да бъде вмъкната между тях, както е направено по-горе. Евакуационната последователност ще бъде разширена. Така изходът става:



Туризмът в Египет е една от водещите икономически индустрии в страната.

Низ чрез двойни кавички

При двойни кавички евакуационните последователности също не се разширяват, но променливите се разширяват. Следният код илюстрира това:

myVar= Туризъм в Египет е една от страната 's водещи икономически индустрии.
изхвърлен $ myVar

Изходът е:

Туризмът в Египет е една от водещите икономически индустрии в страната.

Забележка: апострофът също използва последователността за бягство от пространството.

В тази статия основният вид низ, който се разглежда, е низът в единични кавички.

Основи на регулярното изразяване

Regex

Помислете за този низ:

Този свят всъщност не е наш дом.

Нека светът бъде подниза на интереси. След това големият низ (целият низ) се нарича целеви низ или просто целта. „Светът“ в кавички се нарича редовен израз или просто регекс. Съдържанието, светът, е моделът, в този случай.

Просто съвпадение

В следния код, ако думата „свят“ е намерена в целта, бихме казали, че думата е съпоставена.

стр=„Този ​​свят всъщност не е наш дом.“
рег='свят'
ако [[ $ str= ~$ reg ]];тогава
изхвърленнамерени
иначе
изхвърленне е намерен
бъда

= ~, който е оператор на присвояване, последван от ~, се нарича оператор на свързване. Условието проверява дали моделът е съпоставен в целевия низ. Ако подцела, съответстваща на шаблона, е намерена в целта, ехо изразът показва намерено. Ако не е намерен, ехо изразът не е намерен. Изходът за този код е:

намерени

Тъй като моделът, свят, се намира в целта. Обърнете внимание, че разграничителното пространство след [[и преди]] е запазено.

модел

В горния код „свят“ в кавички е регулярното изражение, докато самият свят е моделът. Това е ясен модел. Повечето модели обаче не са толкова прости. Моделът е характеристика на подниза, която трябва да бъде намерена. И така, моделът Bash използва определени метасимволи. Метасимволът е герой за други герои. За примери, Bash Pattern използва следните метасимволи:

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

Регулярният израз може също да бъде въведен в двойните скоби на условието. Но не е задължително да е в кавички. Така че в този случай това е буквално модел.

Класове персонажи

Квадратни скоби

Резултатът от следния код е намерен, което означава, че е имало съвпадение:

стр=- Котката влезе в стаята.
ако [[ $ str= ~[cbr]при]];тогава
изхвърленнамерени
бъда

Моделът, [cbr] at има съвпадаща котка, която започва с „c“ и която продължава и завършва с в. [cbr] в означава, съответства на „c“ или „b“ или „r“, последвано от at.

Резултатът от следния код е намерен, което означава, че е имало съвпадение:

стр=- Прилепът влезе в стаята.
ако [[ $ str= ~[cbr]при]];тогава
изхвърленнамерени
бъда

Моделът, [cbr] при е съвпаднал бухалка, която започва с „b“ и която продължава и завършва с в. [cbr] в означава, съответства на „c“ или „b“ или „r“, последвано от at.

Резултатът от следния код е намерен, което означава, че е имало съвпадение:

стр=- Плъхът влезе в стаята.
ако [[ $ str= ~[cbr]при]];тогава
изхвърленнамерени
бъда

Моделът, [cbr] at е съвпадащ плъх, който започва с „r“ и който продължава и завършва с в.

В горните примерни кодове програмистът не знае дали котка, прилеп или плъх съществуват в целевия низ. Но той знае, че поднигата започва с „c“ или „b“ или „r“, след което продължава и завършва с. Квадратните скоби в модел позволяват различни възможни знаци да съвпадат с един знак на позиция спрямо другите в целта. И така, квадратните скоби съдържат набор от знаци, от които един е съпоставен за подниза. И накрая, пълната подниза е съпоставена.

Диапазон от знаци

В горния код [cbr] е клас. Дори ако „c“ или „b“ или „r“ съответства на един знак, ако след това веднага не съвпада, моделът няма да съответства на нищо.

Е, има определени диапазони, които ще образуват клас. Например от 0 до 9 цифри формират класа, [0-9] с включени 0 и 9. Малките „a“ до „z“ образуват класа [a-z] с включени „a“ и „z“. Главни букви от „A“ до „Z“ образуват класа [A-Z] с включени „A“ и „Z“. От клас това е един от знаците, които биха съответствали на един знак в низа.

Следният код създава съвпадение:

ако [[ 'ID8id'= ~[0-9] ]];тогава
изхвърленнамерени
бъда

Този път целта е буквален низ в условието. 8, което е едно от възможните числа в диапазона, [0-9], съвпада с 8 в низ, „ID8id“. Горният код е еквивалентен на:

ако [[ 'ID8id'= ~[0123456789] ]];тогава
изхвърленнамерени
бъда

Тук всички възможни числа са записани в шаблона, така че няма тире.

В следния код се получава съвпадение:

ако [[ 'ID8iD'= ~[а-з] ]];тогава
изхвърленнамерени
бъда

Съответствието е между малки букви „i“ на диапазона, [a-z] и малки букви „i“ на целевия низ „ID8iD“.

Запомнете: диапазонът е клас. Класът може да бъде част от по -голям модел. Така че в модел, текстът може да бъде отпред и/или след класа. Следният код илюстрира това:

ако [[ „ID8id е идентификаторът“= ~ ID[0-9]документ за самоличност ]];тогава
изхвърленнамерени
бъда

Изходът е: намерен. „ID8id“ от шаблона съвпада с „ID8id“ в целевия низ.

Отрицание

Съответствието не се получава от следния код:

ако [[ '0123456789101112'= ~[^0-9] ]];тогава
изхвърленнамерени
иначе
изхвърленне е намерен
бъда

Изходът е:

не е намерен

Без ^ пред диапазона, в квадратните скоби, нула от диапазона би съвпаднала с първата нула на целевия низ. Така че ^ пред диапазон (или незадължителни знаци) отрича класа.

Следният код произвежда съвпадение, тъй като условието гласи: съответства на всеки нецифрен знак навсякъде в целта:

ако [[ „ABCDEFGHIJ“= ~[^0-9] ]];тогава
изхвърленнамерени
иначе
изхвърленне е намерен
бъда

Така че изходът е: намерен.

[^0-9] означава нецифрено, така че [^0-9] е отрицанието на [0-9].

[^a-z] означава буква, която не е малка, така че [^a-z] е отрицанието на [a-z].

[^A-Z] означава буква, която не е главна, така че [^A-Z] е отрицанието на [A-Z].

Налични са и други отрицания.

Периодът (.) В шаблона

Точката (.) В шаблона съответства на всеки знак, включително на себе си. Помислете за следния код:

ако [[ '6759WXY.A3'= ~ 7,9 W.Y.A]];тогава
изхвърленнамерени
бъда

Резултатът от кода се намира, защото другите знаци съвпадат. Една точка съвпада с „5“; друга точка съответства на „X“; и последната точка съвпада с точка.

Съответстваща алтернатива

Помислете за това изречение за целеви низ:

В клетката има птици от различни видове.

Някой може да иска да знае дали тази цел има гълъб, паун или орел. Може да се използва следният код:

стр=„В клетката има различни видове пауни.“
ако [[ $ str= ~ гълъб|паун|орел]];тогава
изхвърленнамерени
иначе
изхвърленне е намерен
бъда

Изходът е, намерен. Редуващият се метасимвол, | е бил нает. Може да има две, три, четири и повече алтернативи. Това, което съвпада в този код, е „паун“.

Групиране

В следния модел скобите са използвани за групиране на знаци:

сцена (танцьор)

Групата тук е сценична танцьорка, заобиколена от метасимволите (и). (танцьор) е подгрупа, докато сцена (танцьор) е цялата група. Помислете за следното:

(Танцьорката е страхотна)

Тук подгрупата или поднигата е, танцьорът е страхотен.

Поднизове с общи части

Заинтересованата страна е човек с интерес към бизнеса. Представете си бизнес с уебсайт, stack.com. Представете си, че един от следните целеви низове е в компютъра:

Уебсайтът, stake.com е за бизнеса .;

Има заинтересованата страна .;

Заинтересованата страна работи за stake.com .;

Нека всеки от тези низове бъде целта. Програмистът може да иска да разбере дали stake.com или заинтересованата страна е в какъвто и да е целеви низ. Моделът му ще бъде:

заинтересованата страна

използвайки редуване

залогът е въведен два пъти с двете думи. Това може да се избегне, като въведете шаблона, както следва:

залог (.com | притежател)

.com | притежател е подгрупата в този случай.

Забележка: използването на символа за редуване в този случай. stake.com или заинтересованата страна все още ще бъдат търсени. Изходът на следния код е намерен:

стр=„Уебсайтът, stake.com е за бизнеса.“
ако [[ $ str= ~ залог(|държач) ]];тогава
изхвърленнамерени
бъда

Поднигата, съответстваща тук, е stake.com.

Предварително дефинираният масив BASH_REMATCH

BASH_REMATCH е предварително зададен масив. Да приемем, че даден модел има групи. Цялата съвпадаща група влиза в клетката за индекс 0 на този масив. Първата съответстваща подгрупа влиза в клетката за индекс 1; втората подгрупа съвпада, влиза в клетката за индекс 2 и т.н. Следният код показва как да използвате този масив:

стр='Сценичният танцьор дойде.'
ако [[ $ str= ~ етап (танцьорка) ]];тогава
изхвърленнамерени
бъда

заiв $ {! BASH_REMATCH [@]};направете
printf '$ {BASH_REMATCH [i]}, '
Свършен
изхвърлен

Изходът е:

намерени
сценичен танцьор, танцьор,

Цялата група е сценична танцьорка. Има само една подгрупа, която е танцьорка.

Забележка: пространството в шаблона е избягано.

Съвпадение на независимостта на горния/долния регистър

Съответствието, както е обяснено по-горе, е чувствително към регистъра. Съпоставянето може да се извърши независимо от случая. Това е илюстрирано в следния код:

магазини nocasematch

стр=„Харесваме добра музика.“
ако [[ $ str= ~ GoOd]];тогава
изхвърленнамерени
бъда

магазини -unocasematch

Изходът е: намерен. Моделът е, GoOd. Подреденият подниза е „добър“. Обърнете внимание как опцията nocasematch е активирана в началото на кодовия сегмент и деактивирана в края на кодовия сегмент.

Дължина на низ

Синтаксисът за получаване на дължината на низ е:

$ {#PARAMETER}

Пример:

стр=„Харесваме добра музика.“
изхвърлен $ {# str}

Изходът е: 19.

Намаляване на низове

Синтаксисите за намаляване на низ са:

$ {ПАРАМЕТЪР: ОФСЕТ}
$ {PARAMETER: ОФСЕТ: LENGTH}

където броенето за OFFSET започва от нула.

Следващият пример показва как да премахнете първите 11 знака от низ:

стр='Винаги танцувам под хубава музика.'
изхвърлен $ {str: 10}

Изходът е:

предразположение към добра музика.

Преброяването за LENGTH започва от следващия знак. Следният код показва как може да бъде разрешена част от низа:

стр='Винаги танцувам под хубава музика.'
изхвърлен $ {str: 10: 6}

Изходът е:

ance t

Първите 11 знака бяха премахнати; следващите 6 знака бяха разрешени, а останалите знаци бяха премахнати автоматично.

Търсене и замяна

Когато се намери подниза, тя може да бъде заменена с друга подниза. Синтаксисите за това са:

където=$ {PARAMETER/PATTERN/REPLACEMENT}
където=$ {ПАРАМЕТЪР // ПАТЕНТ/ЗАМЕНЯ}
където=$ {PARAMETER/PATTERN}
където=$ {PARAMETER // PATTERN}

За първия синтаксис с единична наклонена черта напред се заменя само първото съвпадение. Пример:

стр=- В стаята има плъх, прилеп и котка.
надясно=$ {str/[cbr] at/big cow}
изхвърлен $ str
изхвърлен $ ret

Изходът е:

В камерата има плъх, прилеп и котка.
В камерата има голяма крава, прилеп и котка.

За втория синтаксис с двойни наклонени черти напред всички замествания на съвпадението се заменят. Пример:

стр=- В стаята има плъх, прилеп и котка.
надясно=$ {str // [cbr] at/big cow}
изхвърлен $ str
изхвърлен $ ret

Изходът е:

В камерата има плъх, прилеп и котка.
В камерата има голяма крава, голяма крава и голяма крава.

За третия синтаксис с единична наклонена черта няма замяна за първото и единствено съвпадение.

Също така първият намерен подниза се изтрива. Пример:

стр=- В стаята има плъх, прилеп и котка.
надясно=$ {str/[cbr] в}
изхвърлен $ str
изхвърлен $ ret

За четвъртия синтаксис с двойни наклонени черти напред няма замяна за всички съвпадения. Освен това всички намерени поднизове се изтриват. Пример:

стр=- В стаята има плъх, прилеп и котка.
надясно=$ {str // [cbr] в}
изхвърлен $ str
изхвърлен $ ret

Изходът е:

В камерата има плъх, прилеп и котка.
В камерата има a, a и a.

Заключение

За да проверите дали низ има подниза в Bash, трябва да се използва съвпадение на шаблони. Съпоставянето на шаблони не се извършва само в двойни скоби на условието, [[. . . ]]. Той може да се извърши и при разширяване на параметрите със своите $ {. . .}. С разширяването на параметрите е възможно да се получи подниза чрез индекси.

Това, което беше представено в тази статия, са най -критичните точки в съвпадението на шаблони. Има още! Това, което читателят следва да проучи по -нататък, е разширение на името на файла.