String in Variablen in Bash aufteilen

Abdul Mateen 20 Juni 2023
  1. Zeichenfolgen in Bash
  2. Zeichenfolgenfunktionen in Bash
  3. String in Variablen in Bash aufteilen
  4. Verwenden Sie den Befehl cut, um Strings in Bash in Variablen aufzuteilen
  5. Verwenden Sie ein internes Feldtrennzeichen (IFS), um eine Zeichenfolge in Bash in Variablen aufzuteilen
  6. Verwenden Sie read mit sed, um Strings in Bash in Variablen aufzuteilen
  7. Verwenden Sie einen regulären Ausdruck mit Übereinstimmung, um eine Zeichenfolge in Bash in Variablen aufzuteilen
String in Variablen in Bash aufteilen

In diesem Tutorial werden verschiedene Methoden zum Aufteilen einer Zeichenfolge in Variablen in Bash erläutert.

Wir beginnen unsere Diskussion mit einer kurzen Einführung in Saiten. Später werden wir anhand von Bash-Beispielen verschiedene Möglichkeiten zum Teilen von Zeichenfolgen diskutieren.

Zeichenfolgen in Bash

Ein String ist eine Kombination/Sammlung von Zeichen. In Bash ist ein String ein Datentyp wie eine Ganzzahl oder ein Float.

Zeichen können auch Ziffern enthalten, da wir Zahlen innerhalb einer Zeichenfolge als Folge von ASCII-Zeichen sehen.

Bei Datentypen wie Ganzzahlen oder Floats ist die Zahl eine vollständige Entität; es gibt keine individuelle Existenz von Ziffern. In einer Zeichenfolge hat jedoch jedes Zeichen innerhalb der Zeichenfolge (einschließlich Leerzeichen, Komma, Semikolon und Doppelpunkt) seine Darstellung.

Die einzelnen Zeichen ergeben in Kombination auch eine vollständige Zeichenkette. Jedes Zeichen, das Sie über die Tastatur eingeben können, kann Teil der Zeichenfolge sein.

Zum Beispiel:

s1="Welcome"
s2="This is a complete sentence and string as well"
s3="The string, has some special charactrs like ,$%^[]"
s4="The population of country ABC is 12345678"

Hier enthält die erste Zeichenfolge nur Alphabete. Die folgende Zeichenfolge (z. B. s2) enthält ebenfalls Leerzeichen; diese Leerzeichen sind Teil des Strings und werden wie Alphabete gespeichert.

Daher gibt es in der zweiten Zeichenfolge acht Leerzeichen, die acht Bytes im Speicher beanspruchen.

Third-String hat Sonderzeichen, die wiederum Teil des Strings sind.

Schließlich haben wir in der vierten Zeichenfolge eine Zahl, keine Zahl, sondern eine Kombination von Ziffern. Wenn Sie eine Berechnung/einen Vergleich als Zahl durchführen möchten, ist dies unmöglich, es sei denn, Sie werden durch einen Mechanismus in eine Zahl umgewandelt.

Zeichenfolgenfunktionen in Bash

Wie arithmetische Operationen mit Ganzzahlen oder Gleitkommazahlen sind bestimmte Operationen/Funktionen mit Strings möglich/verfügbar.

Beispielsweise können wir zwei Zeichenfolgen auf Gleichheit vergleichen (Gleichheitsoperation ist erforderlich, wenn wir eine Zeichenfolge oder Teilzeichenfolge finden müssen). Hier ist das Bash-Skript:

s1="World Cup."
s2="World Cup"

if [ "$s1" = "$s2" ]; then
    echo "Strings are equal."
else
    echo "Strings are not equal."
fi

s3="World Cup."

if [ "$s1" = "$s3" ];  then
    echo "Both the strings are equal."
else
    echo "Strings are not equal."
fi

Hier haben wir zwei Strings, die gleich aussehen; Der Punkt am Ende der ersten Zeichenfolge unterscheidet sich jedoch.

Das obige Skript vergleicht zuerst die beiden Strings mit einer if-Anweisung, wobei String-Variablen in doppelte Anführungszeichen gesetzt werden und ein einzelnes Gleichheitszeichen zum Vergleich verwendet wird.

Als nächstes deklariert es einen anderen String, s3, der mit dem ersten String identisch ist, und führt erneut einen Vergleich durch. Die Ausgabe dieses Skripts ist:

Strings are not equal.
Both the strings are equal.

Wir können die Länge einer Zeichenfolge mit einem Hash-Zeichen ermitteln. Das Bash-Skript lautet:

s=abcAXYZ123456_AaBbCc
echo "Length of " $s " is:" ${#s}

Die Ausgabe dieses Skripts ist:

Length of abcAXYZ123456_AaBbCc is: 20

Wir können die Länge des Teilstrings mit regulären Ausdrücken vergleichen und erhalten (wir gehen nicht auf Details eines regulären Ausdrucks ein, Sie können hier über reguläre Ausdrücke lesen).

Hier ist der Code für den Abgleich mit einem regulären Ausdruck:

s=abcAXYZ123456_AaBbCc
echo `expr match "$s" 'abc[A-Z]*.2'`
echo `expr "$s" : 'abc[A-Z]*.[0-9]*_'`

Beim ersten Abgleich finden wir kleine abc, gefolgt von Großbuchstaben (Null oder mehr), gefolgt von der Ziffer 2.

Das zweite Match verwendet einen etwas anderen Weg. Gleichwohl wird der mit einem Unterstrich abgeschlossene Teilstring unter Verwendung eines regulären Ausdrucks abgeglichen.

Die Ausgabe des obigen Skripts ist:

9
14

Bei der ersten Übereinstimmung steht die Ziffer 2 an Position 9, und bei der zweiten Übereinstimmung steht der Unterstrich an Position 14. Es gibt eine lange Liste von Operationen/Funktionen, die für Zeichenfolgen möglich sind.

Im ersten Match kommt Ziffer zwei auf Position 9. Im zweiten Match kommt der Unterstrich auf Position 14.

Wir bewegen uns jedoch in Richtung unseres Hauptthemas, dem Teilen einer Zeichenfolge.

String in Variablen in Bash aufteilen

Das Aufteilen einer Zeichenfolge in Zeichen oder Teilzeichenfolgen ist eine übliche und häufig verwendete Operation. Beispielsweise ist eine Aufteilung von Ausdrücken in Variablen und Operatoren (als Token bezeichnet) erforderlich, bevor sie ausgewertet werden können.

Vor Beginn der Übersetzungsphase verwenden Compiler oder andere Sprachübersetzer lexikalische Analysatoren, um ein Programm, eine Zeichenfolge, zu analysieren und in Variablen, Schlüsselwörter, Blöcke, Funktionen usw. aufzuteilen. Bei der Verarbeitung natürlicher Sprache wird die Aufteilung eines Artikels in Sätze, Wörter, Verben, Substantive usw. ist erforderlich.

In Bash gibt es verschiedene Möglichkeiten, einen String aufzuteilen. Wir werden sie anhand von Beispielen diskutieren.

Verwenden Sie den Befehl cut, um Strings in Bash in Variablen aufzuteilen

In Bash können wir die Operation cut verwenden, um einen String zu teilen. Die Syntax des cut-Befehls lautet:

cut -f(number) -d(delimiter)

Der Befehl cut teilt eine Zeichenfolge basierend auf dem Trennzeichen, das nach der Option -d angegeben wird. Das Trennzeichen in den Zeichenfolgen kann ein beliebiges Zeichen sein, das zwei Teilzeichenfolgen trennt (oder von dem angenommen wird, dass es diese trennt).

Beispielsweise werden in der englischen Sprache Sätze durch einen Punkt getrennt; Daher kann ein Punkt als Trennzeichen zum Trennen von Sätzen betrachtet werden. Ebenso ist Leerzeichen ein Trennzeichen, um Wörter zu trennen.

Ein Operator ist ein Trennzeichen zwischen Operanden in einem arithmetischen Ausdruck (in der Programmierung).

Als nächstes haben wir ein Skript, in dem wir eine Zeichenfolge mit einem Bindestrich als Trennzeichen haben. Der String wird in drei Variablen aufgeteilt.

Wenn wir eine Variable zum ersten Mal verwenden, ist kein Dollarzeichen erforderlich; nachfolgende Operationen erfordern jedoch ein Dollarzeichen mit Variablen. Das Skript lautet:

v="0123-456-789"
v1=$(echo $v | cut -f1 -d-)
v2=$(echo $v | cut -f2 -d-)
v3=$(echo $v | cut -f3 -d-)
echo $v1
echo $v2
echo $v3

Die Ausgabe dieses Skripts ist:

0123
456
789

Wir werden ein weiteres Trennzeichen mit einer cut-Operation verwenden, um Ihnen eine Vorstellung zu geben. Hier ist ein weiteres Skript mit einem Doppelpunkt als Trennzeichen:

v="0123:456:789"
v1=$(echo $v | cut -f1 -d:)
v2=$(echo $v | cut -f2 -d:)
v3=$(echo $v | cut -f3 -d:)
echo $v1
echo $v2
echo $v3

Der Code ist bis auf das Trennzeichen gleich. Der Doppelpunkt ist ein Trennzeichen in der Zeichenfolge; das gleiche wird bei der Schnitt-Operation verwendet.

Die Ausgabe dieses Skripts ist:

0123
456
789

Die Operation Ausschneiden hat die Option eines einzelnen Trennzeichens; Mit einem internen Feldtrennzeichen können wir jedoch mehrere Trennzeichen verwenden.

Verwenden Sie ein internes Feldtrennzeichen (IFS), um eine Zeichenfolge in Bash in Variablen aufzuteilen

Mit IFS können wir einzelne oder mehrere Trennzeichen verwenden. Bei einem einzelnen Trennzeichen sind keine Anführungszeichen erforderlich; Um jedoch verschiedene Trennzeichen zu verwenden, können doppelte Anführungszeichen mehr als ein Trennzeichen enthalten.

Schauen wir uns ein sehr einfaches Beispiel an:

IFS=- read v1 v2 v3 v4 <<< this-is-batch-file
echo $v1
echo $v2
echo $v3
echo $v4

Im obigen Skript hat das IFS nur ein einziges Trennzeichen. Lesen Sie mit IFS die Zuweisung des Strings this-is-batch-file zu den Variablen v1 bis v4.

Die Ausgabe dieses Skripts ist:

this
is
batch
file

Als nächstes haben wir ein Beispiel für mehrere Trennzeichen. Siehe folgendes Skript:

IFS=" ,: " read v1 v2 v3 v4 <<< is,something,strange:there
echo $v1
echo $v2
echo $v3
echo $v4

Hier werden in IFS zwei Trennzeichen verwendet, und die Zeichenfolge enthält auch zwei Trennzeichen. Die ersten drei Wörter werden durch ein Komma und das letzte Wort durch einen Doppelpunkt getrennt.

Die Ausgabe ist:

is
something
strange
there

Wenn wir jetzt IFS verwenden, haben wir die Möglichkeit, mehrere Trennzeichen zu verwenden.

Müssen wir immer ein Trennzeichen angeben, um die Zeichenfolge zu teilen? Die Antwort ist nein; Wir haben auch andere Möglichkeiten.

Verwenden Sie read mit sed, um Strings in Bash in Variablen aufzuteilen

Wir können einen String mit read und sed (einem speziellen Befehl, der viele String-Operationen Zeile für Zeile ausführen kann) in ein Array von Zeichen aufteilen. Sobald wir also eine Reihe von Zeichen haben, können wir sie gemäß unseren spezifischen Anforderungen manipulieren.

Hier ist das Skript:

read -ra var5 <<<"$(echo "12-34-56" | sed 's/./& /g')"
echo ${var5[0]}
echo ${var5[1]}
echo ${var5[2]}
echo ${var5[3]}

Die Ausgabe dieses Skripts ist:

1
2
-
3

Beachten Sie, dass sogar ein Bindestrich als Zeichen platziert wird; Daher kann diese Methode die Zeichenfolge an keinem Trennzeichen aufteilen. Stattdessen wird die Zeichenfolge in ein Array von Zeichen aufgeteilt.

Es gibt eine Ausnahme von dieser Methode. Wenn Sie Leerzeichen zwischen den Zeichen verwenden, ignoriert der Prozess das Leerzeichen, und das resultierende Array enthält keine Leerzeichen.

Lassen Sie uns dies anhand des folgenden Skripts und der angrenzenden Ausgabe verstehen:

read -ra var51 <<<"$(echo "FG HI JK" | sed 's/./& /g')"
echo ${var51[0]}
echo ${var51[1]}
echo ${var51[2]}
echo ${var51[3]}

Die Ausgabe ist:

F
G
H
I

In der Ausgabe ist ersichtlich, dass Index/Index 2 anstelle eines Leerzeichens den Buchstaben H enthält.

Verwenden Sie einen regulären Ausdruck mit Übereinstimmung, um eine Zeichenfolge in Bash in Variablen aufzuteilen

Wir haben bereits einen Link geteilt, um mehr über reguläre Ausdrücke zu erfahren. Hier haben wir eine andere Möglichkeit, Zeichenfolgen aufzuteilen, indem wir reguläre Ausdrücke und Übereinstimmungsoperationen mit =~ verwenden.

Das Skript lautet:

re="^([^-]+)-(.*)$"
[[ "31-28-31" =~ $re ]] && var6="${BASH_REMATCH[1]}" && var_r="${BASH_REMATCH[2]}"
[[ $var_r =~ $re ]] && var7="${BASH_REMATCH[1]}" && var8="${BASH_REMATCH[2]}"
echo "First:" $var6
echo "Second:" $var7
echo "Third:" $var8

Auch hier wird Bindestrich als Trennzeichen verwendet, und unser regulärer Ausdruck enthält einen Bindestrich. Die Ausgabe ist:

First: 31
Second: 28
Third: 31

Als nächstes haben wir die gleiche Methode mit einem anderen Trennkomma. Das Skript lautet:

re1="^([^,]+),(.*)$"
[[ "high,risk" =~ $re1 ]] && v1="${BASH_REMATCH[1]}" && v2="${BASH_REMATCH[2]}"
echo "First:" $v1
echo "Second:" $v2

Die Ausgabe ist:

First: high
Second: risk

Schließlich haben wir verschiedene Möglichkeiten in Bash vorgestellt, um den String aufzuteilen und in Variablen zu speichern. Jetzt können die Leser die Methode verwenden, die ihren Anforderungen am besten entspricht.

Verwandter Artikel - Bash String