So erkennen Sie, ob ein Bash-String unter Linux einen Teilstring enthält

Veröffentlicht: 2022-09-21
Linux-Laptop mit einer Bash-Eingabeaufforderung
fatmawati achmad zaenuri/Shutterstock.com

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

So manipulieren Sie Zeichenfolgen in Bash unter Linux
RELATED So manipulieren Sie Zeichenfolgen in Bash unter Linux

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 
So verwenden Sie bedingte Tests mit doppelter Klammer in Linux
RELATED How to Use Double Bracket Conditional Tests in Linux

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 

Skript mit chmod ausführbar machen

Lassen Sie uns das Skript ausführen.

 ./double.sh 

Ausführen des double.sh-Skripts

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 

Ausführen des double2.sh-Skripts

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 

Ausführen des double3.sh-Skripts

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 

Ausführen des case.sh-Skripts

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.

So verwenden Sie den grep-Befehl unter Linux
RELATED How to Use the grep Command on Linux

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 

Ausführen des subgrep.sh-Skripts

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.

So verwenden Sie den sed-Befehl unter Linux
RELATED How to Use the sed Command on Linux

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 

Ausführen des subsed.sh-Skripts

Wir können die Logik des Skripts testen, indem wir den Wert von $substring so bearbeiten, dass der Vergleich fehlschlägt.

./subsed.sh

Ausführen des subsed.sh-Skripts mit einer nicht übereinstimmenden Teilzeichenfolge

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