Како да препознаете дали низата Bash содржи подниза на Linux
Понекогаш во скриптите на Linux, сакате да знаете дали низата текст содржи специфична, помала низа. Постојат многу начини да го направите ова. Ви прикажуваме неколку едноставни, сигурни техники.
Зошто е ова корисно?
Пребарувањето низа за помала подниза е вообичаено барање. Еден пример би бил читање текст од датотека или од човечки внес и пребарување на низата за одредена подниза, така што вашата скрипта може да одлучи што да прави следно. Можеби бара етикета или име на уред во конфигурациска датотека или командна низа во линијата на внесување од корисник.
Корисниците на Linux се благословени со кој било број на алатки за манипулирање со текст. Некои се вградени во школката Bash, други се обезбедени како самостојни комунални услуги или апликации. Има причина зошто оперативните системи добиени од Unix се богато опслужени со можности за манипулација со низа.
Некои работи што изгледаат како датотеки не се едноставни датотеки. Тие се специјални датотеки што претставуваат работи како хардверски уреди и извори на системски информации. Апстракцијата што ја врши оперативниот систем им дава изглед и карактеристики на датотеките. Можете да читате информации од нив - како текст, природно - и во некои случаи да им пишувате, но тие не се обични датотеки.
Текстот исто така се користи како влез и излез за команди во терминалниот прозорец. Ова овозможува пренасочување и цевки на влезот и излезот. Таа функционалност ја поткрепува способноста за синџир на секвенци на команди на Linux заедно, пренесувајќи го излезот од една команда како влез на друга.
Без оглед на неговото потекло, пребарувањето на текстот што го добиваме за значаен збор, команда, етикета или некој друг индикатор е стандарден дел од справувањето со податоци базирани на текст. Еве збирка на едноставни техники што можете да ги вклучите во вашите сопствени скрипти.
Наоѓање поднизи со вградени баш
Тестот за споредба на низи со двојни загради „[[...]]
може да се користи во изјавите if
за да се утврди дали една низа содржи друга низа.
Копирајте ја оваа скрипта во уредувач и зачувајте ја во датотека наречена „double.sh“.
#!/bin/bash
if [[ "monkey" = *"key"* ]]; then
echo "key is in monkey"
else
echo "key is not in monkey"
fi
Ќе треба да ја направите скриптата извршна со командата chmod
. Ова е чекор кој секогаш е потребен за да се направи која било скрипта извршна. Ќе треба да го правите ова секој пат кога ќе креирате датотека со скрипта. Заменете го името на соодветната скрипта во секој случај.
chmod +x double.sh
Ајде да го извршиме сценариото.
./double.sh
Ова функционира затоа што ѕвездичката „ *
“ претставува која било низа знаци, вклучувајќи без знаци. Ако „клучот“ на поднизата се наоѓа во целната низа, со или без знаци пред или зад неа, тестот ќе се врати точно.
Во нашиот пример, има знаци пред поднизата. Тие се совпаѓаат со првата ѕвездичка. Нема букви зад поднизата, но бидејќи ѕвездичката исто така не се совпаѓа со никакви знаци, тестот сепак поминува.
За флексибилност, можеме да ја измениме нашата скрипта за да ракува со променливи наместо буквални низи. Ова е скрипта „double2.sh“.
#!/bin/bash
string="Monkey"
substring="key"
if [[ $string = *$substring* ]]; then
echo "$substring was found in $string"
else
echo "$substring was not found in $string"
fi
Ајде да видиме како тоа функционира.
./double2.sh
Ова функционира на ист начин, со предност што можеме да користиме имиња на променливи наместо буквални низи. Претворањето на нашето мало решение во функција ќе обезбеди најголема флексибилност.
Ова е скрипта „double3.sh“.
#!/bin/bash
shopt -s nocasematch
string="Monkey"
substring="Key"
capital="London"
check_substring ()
{
if [[ $1 = *$2* ]]; then
echo "$2 was found in $1"
else
echo "$2 was not found in $1"
fi
}
check_substring "Monkey" "key"
check_substring $string $substring
check_substring $string "banana"
check_substring "Wales" $capital
Ја нарекуваме нашата функција check_substring
користејќи мешавина од променливи и буквални низи. Ја користевме shopt
со неговата опција -s
(set) за да поставиме nocasematch
, за да ги направиме совпаѓањата нечувствителни на букви.
Еве како работи.
./double3.sh
Можеме да го искористиме трикот за завиткување на поднизата во ѕвездички и во изјавите case
. Ова е „случај.ш“.
#!/bin/bash
shopt -s nocasematch
string="Wallaby"
substring="Wall"
case $string in
*$substring*)
echo "$substring was found in $string"
;;
*)
echo "Nothing matched: $string"
;;
esac
Користењето на искази case
наместо многу долги изјави if
може да ги олесни скриптите за читање и отстранување грешки. Ако треба да проверите дали низата содржи една од многуте можни поднизи, изјавата case
би била најдобриот избор.
./case.sh
Поднизата е пронајдена.
Наоѓање поднизи со grep
Покрај вградените Bash, првата алатка за пребарување на текст што веројатно ќе ја достигнете е grep
. Можеме да ја искористиме вродената способност на grep
да бара низа во низа за да ги бараме нашите поднизи.
Оваа скрипта се нарекува „subgrep.sh“.
#!/bin/bash
string="porridge pot"
substring="ridge"
if $(echo $string | grep -q $substring); then
echo "$substring was found in $string"
else
echo "$substring was not found in $string"
fi
Скриптата користи echo
за да ја испрати низата во grep
, која ја бара поднизата. Ја користиме опцијата -q
(тивка) за да престанеме grep
да пишува што било на стандарден излез.
Ако резултатот од наредбите во заградите „(...)
“ е еднаков на нула, тоа значи дека е пронајдено совпаѓање. Бидејќи нулата е еднаква на true
во Bash, изјавата if
е задоволена и клаузулата then
се извршува.
Ајде да видиме каков е неговиот излез.
./subgrep.sh
Наоѓање на поднизи со сед
Можеме да користиме sed
за да најдеме и подниза.
Стандардно, sed
го печати целиот текст што се внесува во него. Користењето на sed -n
го спречува ова. Единствените линии што се печатат се соодветните линии. Овој израз ќе ги отпечати сите линии што се совпаѓаат или ја содржат вредноста на $substring.
"/$substring/p"
Вредноста на $string
ја внесуваме во sed
користејќи пренасочување овде, <<<
. Ова се користи за пренасочување на вредностите во команда во тековната школка. Не повикува на подшколка на начин на кој тоа би го направила цевката.
Првиот -n
е тестот. Ќе се врати true
ако излезот од командата sed
не е нула. Единствениот начин на кој излезот од sed
може да биде не-нула е ако се најде соодветна линија. Ако е така, $substring
мора да е пронајден во $string
.
Ова е „subsed.sh“.
#!/bin/bash
string="Sweden"
substring="eden"
if [ -n "$(sed -n "/$substring/p" <<< $string)" ]; then
echo "$substring was found in $string"
else
echo "$substring was not found in $string"
fi
Го добиваме очекуваниот одговор кога ќе го извршиме сценариото.
./subsed.sh
Можеме да ја тестираме логиката на скриптата со уредување на вредноста на $substring
така што споредбата не успее.
./subsed.sh
Престани да бараш, го најдов
Другите алатки можат да најдат поднизи, како што се awk
и Perl
, но едноставниот случај на употреба како наоѓање подниза не ја гарантира нивната дополнителна функционалност ниту дополнителна сложеност. Конкретно, користењето на вградените Bash за пребарување на поднизи е брзо, едноставно и не бара надворешни алатки.