Hoe weet ik of een Bash-string een substring bevat op Linux?

Hoe weet ik of een Bash-string een substring bevat op Linux?
fatmawati achmad zaenuri/Shutterstock.com

Soms wil je in Linux-scripts weten of een tekenreeks een specifieke, kleinere tekenreeks bevat. Er zijn veel manieren om dit te doen. We laten u enkele eenvoudige, betrouwbare technieken zien.

Waarom is dit handig?

Het zoeken naar een tekenreeks voor een kleinere subtekenreeks is een veelvoorkomende vereiste. Een voorbeeld is het lezen van tekst uit een bestand of van menselijke invoer en het zoeken in de tekenreeks naar een specifieke subtekenreeks, zodat uw script kan beslissen wat het vervolgens moet doen. Het kan zoeken naar een label of apparaatnaam in een configuratiebestand of een opdrachtreeks in een invoerregel van een gebruiker.

Linux-gebruikers zijn gezegend met een onbeperkt aantal hulpprogramma’s voor het manipuleren van tekst. Sommige zijn ingebouwd in de Bash-shell, andere worden geleverd als zelfstandige hulpprogramma’s of toepassingen. Er is een reden waarom Unix-afgeleide besturingssystemen rijkelijk worden bediend met mogelijkheden voor het manipuleren van strings.

Strings manipuleren in Bash op Linux

VERWANTStrings manipuleren in Bash op Linux

Sommige dingen die op bestanden lijken, zijn geen eenvoudige bestanden. Zij zijn speciale bestanden dingen zoals hardwareapparaten en bronnen van systeeminformatie vertegenwoordigen. De abstractie die door het besturingssysteem wordt uitgevoerd, geeft ze het uiterlijk en de kenmerken van bestanden. Je kunt er informatie uit lezen – natuurlijk als tekst – en in sommige gevallen naar ze schrijven, maar het zijn geen gewone bestanden.

Tekst wordt ook gebruikt als invoer en uitvoer voor opdrachten in een terminalvenster. Dit maakt het omleiden en doorleiden van input en output mogelijk. Die functionaliteit ondersteunt de mogelijkheid om reeksen van Linux-opdrachten aan elkaar te koppelen, waarbij de uitvoer van de ene opdracht als invoer naar de volgende wordt doorgegeven.

Ongeacht de oorsprong, het doorzoeken van de tekst die we ontvangen op een belangrijk woord, commando, label of een andere indicator is een standaard onderdeel van het omgaan met op tekst gebaseerde gegevens. Hier is een verzameling eenvoudige technieken die u in uw eigen scripts kunt opnemen.

Substrings zoeken met Bash-ingebouwde

De dubbele haakjes “[[...]]” stringvergelijkingstest kan worden gebruikt in if instructies om te bepalen of een tekenreeks een andere tekenreeks bevat.

Kopieer dit script naar een editor en sla het op in een bestand met de naam “double.sh”.

#!/bin/bash

if [[ "monkey" = *"key"* ]]; then
  echo "key is in monkey"
else
  echo "key is not in monkey"
fi
Voorwaardelijke tests met dubbele beugel gebruiken in Linux

VERWANTVoorwaardelijke tests met dubbele beugel gebruiken in Linux

U moet het script uitvoerbaar maken met de chmod opdracht. Dit is een stap die altijd nodig is om elk script uitvoerbaar te maken. U moet dit elke keer doen als u een scriptbestand maakt. Vervang in elk geval de naam van het juiste script.

chmod +x double.sh

een script uitvoerbaar maken met chmod

Laten we het script uitvoeren.

./double.sh

Het double.sh-script uitvoeren

Dit werkt omdat het sterretje ” * ” staat voor elke reeks tekens, inclusief geen tekens. Als de subtekenreeks “sleutel” zich binnen de doelreeks bevindt, met of zonder tekens ervoor of erachter, zal de test true retourneren.

In ons voorbeeld staan ​​er tekens voor de subtekenreeks. Deze worden geëvenaard door het eerste sterretje. Er staan ​​geen letters achter de substring, maar omdat een asterisk ook niet overeenkomt met geen karakters, slaagt de test toch.

Voor flexibiliteit kunnen we ons script aanpassen om variabelen te verwerken in plaats van letterlijke tekenreeksen. Dit is het script “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

Laten we eens kijken hoe dat loopt.

./double2.sh

Het double2.sh-script uitvoeren

Dit werkt op dezelfde manier, met als voordeel dat we variabelenamen kunnen gebruiken in plaats van letterlijke strings. Het omzetten van onze kleine oplossing in een functie biedt de meeste flexibiliteit.

Dit is script “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

We noemen onze check_substring functie met behulp van een mix van variabelen en letterlijke tekenreeksen. We gebruikten shopt met zijn -s (set) optie om in te stellen nocasematchom de overeenkomsten hoofdletterongevoelig te maken.

Hier is hoe het loopt.

./double3.sh

Het double3.sh-script uitvoeren

We kunnen de truc gebruiken om de substring in asterisken in te wikkelen in case verklaringen ook. Dit is “case.sh.”

#!/bin/bash

shopt -s nocasematch

string="Wallaby"
substring="Wall"

case $string in

  *$substring*)
    echo "$substring was found in $string"
    ;;

  *)
    echo "Nothing matched: $string"
    ;;
esac

Gebruik makend van case uitspraken in plaats van erg lang if instructies kunnen scripts gemakkelijker te lezen en te debuggen maken. Als u moest controleren of een tekenreeks een van de vele mogelijke subtekenreeksen bevatte, de case verklaring zou de beste keuze zijn.

./case.sh

Het case.sh-script uitvoeren

De subtekenreeks is gevonden.

Substrings zoeken met grep

Naast de ingebouwde Bash-functies, is de eerste tekstzoektool die u waarschijnlijk zult gebruiken grep. We kunnen gebruiken grep’s aangeboren vermogen om te zoeken naar een tekenreeks binnen een tekenreeks om te zoeken naar onze subtekenreeksen.

Dit script wordt “subgrep.sh” genoemd.

#!/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

Het script gebruikt echo om de string in te sturen grep, die zoekt naar de subtekenreeks. We gebruiken de -q (stille) optie om te stoppen grep iets naar standaarduitvoer schrijven.

Hoe de grep-opdracht op Linux te gebruiken

VERWANTHoe het grep-commando op Linux te gebruiken

Als het resultaat van de opdrachten tussen haakjes “(...)” gelijk is aan nul, betekent dit dat er een overeenkomst is gevonden. Omdat nul gelijk is aan true in Bash, de if verklaring is voldaan en de then clausule wordt uitgevoerd.

Laten we eens kijken wat de output is.

./subgrep.sh

Het subgrep.sh-script uitvoeren

Substrings zoeken met sed

We kunnen gebruiken sed om ook een subtekenreeks te vinden.


Standaard, sed drukt alle tekst af die erin wordt ingevoerd. Gebruik makend van sed -n voorkomt dit. De enige lijnen die worden afgedrukt, zijn overeenkomende lijnen. Deze expressie drukt alle regels af die overeenkomen met of de waarde van $substring bevatten.

"/$substring/p"

We voeden de waarde van $string naar binnen sed met behulp van een hier omleiding, <<<. Dit wordt gebruikt om waarden om te leiden naar een opdracht in de huidige shell. Het roept geen subshell aan zoals een pipe dat zou doen.

Hoe de sed-opdracht op Linux te gebruiken

VERWANTHoe de sed-opdracht op Linux te gebruiken

De eerste -n is de toets. Het zal terugkeren true als de uitvoer van de sed commando is niet nul. De enige manier waarop de uitvoer van sed kan niet nul zijn als er een overeenkomende regel is gevonden. Als dat het geval is, $substring moet zijn gevonden in $string.

Dit is “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

We krijgen het verwachte antwoord wanneer we het script uitvoeren.

./subsed.sh

Het subs.sh-script uitvoeren

We kunnen de logica van het script testen door de waarde van te bewerken $substring zodat de vergelijking faalt.

./subsed.sh

Het subss.sh-script uitvoeren met een ongeëvenaarde subtekenreeks

Stop met zoeken, heb het gevonden

Andere tools kunnen substrings vinden, zoals awk en Perl maar een eenvoudige use-case, zoals het vinden van een substring, rechtvaardigt hun extra functionaliteit of de toegevoegde complexiteit niet. In het bijzonder is het gebruik van de ingebouwde Bash om naar substrings te zoeken snel, eenvoudig en vereist geen externe tools.

Nieuwste artikelen

Gerelateerde artikelen