
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.
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
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

Laten we het script uitvoeren.
./double.sh

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

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

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

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.
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

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.
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

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

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.