Како да препознаете дали низата 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 за пребарување на поднизи е брзо, едноставно и не бара надворешни алатки.