So erkennen Sie, ob ein Bash-String unter Linux einen Teilstring enthält
Veröffentlicht: 2022-09-21Manchmal möchten Sie in Linux-Skripten wissen, ob eine Textzeichenfolge eine bestimmte, kleinere Zeichenfolge enthält. Es gibt viele Möglichkeiten, dies zu tun. Wir zeigen Ihnen einige einfache, zuverlässige Techniken.
Warum ist das nützlich?
Das Durchsuchen einer Zeichenfolge nach einer kleineren Teilzeichenfolge ist eine häufige Anforderung. Ein Beispiel wäre das Lesen von Text aus einer Datei oder aus menschlicher Eingabe und das Durchsuchen der Zeichenfolge nach einer bestimmten Teilzeichenfolge, damit Ihr Skript entscheiden kann, was als Nächstes zu tun ist. Es kann nach einer Bezeichnung oder einem Gerätenamen in einer Konfigurationsdatei oder einer Befehlszeichenfolge in einer Eingabezeile eines Benutzers suchen.
Linux-Benutzer sind mit einer Vielzahl von Dienstprogrammen zum Bearbeiten von Text gesegnet. Einige sind in die Bash-Shell integriert, andere werden als eigenständige Dienstprogramme oder Anwendungen bereitgestellt. Es gibt einen Grund, warum von Unix abgeleitete Betriebssysteme reichlich mit Möglichkeiten zur String-Manipulation ausgestattet sind.
Einige Dinge, die Dateien zu sein scheinen, sind keine einfachen Dateien. Sie sind spezielle Dateien , die Dinge wie Hardwaregeräte und Quellen von Systeminformationen darstellen. Die vom Betriebssystem durchgeführte Abstraktion verleiht ihnen das Aussehen und die Eigenschaften von Dateien. Sie können Informationen aus ihnen lesen – natürlich als Text – und in einigen Fällen darauf schreiben, aber es sind keine gewöhnlichen Dateien.
Text wird auch als Ein- und Ausgabe für Befehle in einem Terminalfenster verwendet. Dies ermöglicht die Umleitung und Weiterleitung von Ein- und Ausgängen. Diese Funktionalität unterstützt die Fähigkeit, Sequenzen von Linux-Befehlen miteinander zu verketten und die Ausgabe eines Befehls als Eingabe an den nächsten weiterzugeben.
Ungeachtet seines Ursprungs ist das Durchsuchen des erhaltenen Textes nach einem aussagekräftigen Wort, Befehl, Label oder einem anderen Indikator ein Standardbestandteil beim Umgang mit textbasierten Daten. Hier ist eine Sammlung einfacher Techniken, die Sie in Ihre eigenen Skripte integrieren können.
Finden von Teilstrings mit Bash-Builins
Der Zeichenfolgenvergleichstest „ [[...]]
“ in doppelten Klammern kann in if
-Anweisungen verwendet werden, um festzustellen, ob eine Zeichenfolge eine andere Zeichenfolge enthält.
Kopieren Sie dieses Skript in einen Editor und speichern Sie es in einer Datei namens „double.sh“.
#!/bin/bash if [[ "Affe" = *"Schlüssel"* ]]; dann Echo "Schlüssel steckt im Affen" anders Echo "Schlüssel ist nicht im Affen" fi
Sie müssen das Skript mit dem Befehl chmod
ausführbar machen. Dies ist ein Schritt, der immer erforderlich ist, um ein Skript ausführbar zu machen. Sie müssen dies jedes Mal tun, wenn Sie eine Skriptdatei erstellen. Ersetzen Sie jeweils den Namen des entsprechenden Skripts.
chmod +x double.sh
Lassen Sie uns das Skript ausführen.
./double.sh
Das funktioniert, weil das Sternchen „ *
“ eine beliebige Folge von Zeichen darstellt, auch keine Zeichen. Wenn sich die Teilzeichenfolge „Schlüssel“ innerhalb der Zielzeichenfolge befindet, mit oder ohne Zeichen davor oder dahinter, gibt der Test wahr zurück.
In unserem Beispiel stehen Zeichen vor dem Teilstring. Diese werden durch das erste Sternchen abgeglichen. Hinter der Teilzeichenfolge stehen keine Buchstaben, aber da ein Sternchen auch keinen Zeichen entspricht, wird der Test trotzdem bestanden.
Aus Gründen der Flexibilität können wir unser Skript so ändern, dass es Variablen anstelle von wörtlichen Zeichenfolgen verarbeitet. Dies ist das Skript „double2.sh“.
#!/bin/bash string="Affe" substring="Schlüssel" if [[ $string = *$substring* ]]; dann echo "$substring wurde in $string gefunden" anders echo "$substring wurde nicht in $string gefunden" fi
Mal sehen, wie das läuft.
./double2.sh
Dies funktioniert auf die gleiche Weise, mit dem Vorteil, dass wir Variablennamen anstelle von wörtlichen Zeichenfolgen verwenden können. Die Umwandlung unserer kleinen Lösung in eine Funktion bietet die größte Flexibilität.
Dies ist das Skript „double3.sh“.
#!/bin/bash shopt -s nocasematch string="Affe" substring="Schlüssel" capital="London" check_substring () { wenn [[ $1 = *$2* ]]; dann echo "$2 wurde in $1 gefunden" anders echo "$2 wurde nicht in $1 gefunden" fi } check_substring "Affe" "Schlüssel" check_substring $string $substring check_substring $string "Banane" check_substring "Wales" $kapital
Wir rufen unsere check_substring
Funktion mit einer Mischung aus Variablen und Literal-Strings auf. Wir shopt
mit seiner Option -s
(set) verwendet, um nocasematch
, um die Groß- und Kleinschreibung der Übereinstimmungen zu ignorieren.
So läuft es.
./double3.sh
Wir können den Trick anwenden, den Teilstring auch in case
-Anweisungen in Sternchen einzuschließen. Dies ist „case.sh“.
#!/bin/bash shopt -s nocasematch string="Wallaby" substring="Wand" fall $string ein *$substring*) echo "$substring wurde in $string gefunden" ;; *) echo "Nichts gefunden: $string" ;; esac
Die Verwendung von case
-Anweisungen anstelle von sehr langen if
-Anweisungen kann das Lesen und Debuggen von Skripten erleichtern. Wenn Sie überprüfen müssten, ob ein String einen von vielen möglichen Teilstrings enthält, wäre die case
-Anweisung die beste Wahl.
./fall.sh
Der Teilstring wird gefunden.
Teilstrings finden mit grep
Abgesehen von den Bash-Builts ist grep
das erste Textsuchtool, nach dem Sie wahrscheinlich greifen werden. Wir können die angeborene Fähigkeit von grep
verwenden, nach einer Zeichenfolge innerhalb einer Zeichenfolge zu suchen, um nach unseren Teilzeichenfolgen zu suchen.
Dieses Skript heißt „subgrep.sh“.
#!/bin/bash string="Breitopf" substring="Grat" if $(echo $string | grep -q $substring); dann echo "$substring wurde in $string gefunden" anders echo "$substring wurde nicht in $string gefunden" fi
Das Skript verwendet echo
, um die Zeichenfolge an grep
zu senden, das nach der Teilzeichenfolge sucht. Wir verwenden die Option -q
(quiet), um zu verhindern, dass grep
irgendetwas in die Standardausgabe schreibt.
Wenn das Ergebnis der Befehle in den Klammern „ (...)
“ gleich Null ist, bedeutet dies, dass eine Übereinstimmung gefunden wurde. Da null in Bash gleich true
ist, ist die if
-Anweisung erfüllt und die then
-Klausel wird ausgeführt.
Mal sehen, was seine Ausgabe ist.
./subgrep.sh
Teilstrings finden mit sed
Wir können sed
auch verwenden, um einen Teilstring zu finden.
Standardmäßig druckt sed
den gesamten Text, der ihm zugeführt wird. Die Verwendung von sed -n
verhindert dies. Die einzigen Zeilen, die gedruckt werden, sind übereinstimmende Zeilen. Dieser Ausdruck gibt alle Zeilen aus, die mit dem Wert von $substring übereinstimmen oder diesen enthalten.
"/$substring/p"
Wir füttern den Wert von $string
in sed
mit einer Here-Umleitung, <<<
. Dies wird verwendet, um Werte in einen Befehl in der aktuellen Shell umzuleiten. Es ruft keine Subshell auf, wie es eine Pipe tun würde.
Das erste -n
ist der Test. Es wird true
zurückgegeben, wenn die Ausgabe des Befehls sed
ungleich Null ist. Die Ausgabe von sed
kann nur dann ungleich Null sein, wenn eine passende Zeile gefunden wurde. Wenn das der Fall ist, muss $substring
in $string
gefunden worden sein.
Dies ist „subsed.sh“.
#!/bin/bash string="Schweden" substring="eden" if [ -n "$(sed -n "/$substring/p" <<< $string)" ]; dann echo "$substring wurde in $string gefunden" anders echo "$substring wurde nicht in $string gefunden" fi
Wir erhalten die erwartete Antwort, wenn wir das Skript ausführen.
./subsed.sh
Wir können die Logik des Skripts testen, indem wir den Wert von $substring
so bearbeiten, dass der Vergleich fehlschlägt.
./subsed.sh
Hör auf zu suchen, habe es gefunden
Andere Tools wie awk
und Perl
können Teilstrings finden, aber ein einfacher Anwendungsfall wie das Finden eines Teilstrings rechtfertigt weder ihre zusätzliche Funktionalität noch die zusätzliche Komplexität. Insbesondere die Verwendung der Bash-Builts zur Suche nach Teilstrings ist schnell, einfach und erfordert keine externen Tools.
VERWANDT: Verwendung von Case-Anweisungen in Bash-Skripten