String teilen in Bash
-
Verwenden des Befehls
tr
zum Aufteilen einer Zeichenkette in Bash -
Verwenden von
IFS
zum Aufteilen einer Zeichenkette in Bash -
Verwenden des Befehls
read
zum Teilen einer Zeichenkette in Bash - Verwenden der Parametererweiterung zum Teilen eines Strings in Bash
-
Verwenden des Befehls
cut
zum Teilen einer Zeichenkette in Bash
Dieses Tutorial demonstriert das Aufteilen eines Strings an einem Trennzeichen in der Bash mit den Befehlen tr
, IFS
, read
, Parameterexpansion und cut
.
Verwenden des Befehls tr
zum Aufteilen einer Zeichenkette in Bash
Der Befehl tr
ist eine Kurzform für translate
. Es übersetzt, löscht und quetscht Zeichen aus der Standardeingabe und schreibt die Ergebnisse in die Standardausgabe.
Es ist ein nützlicher Befehl zum Bearbeiten von Text in der Befehlszeile oder in einem Bash-Skript. Es kann wiederholte Zeichen entfernen, Kleinbuchstaben in Großbuchstaben umwandeln und Zeichen ersetzen.
Im Bash-Skript unten leitet der Befehl echo
die String-Variable $addrs
an den Befehl tr
weiter, der die String-Variable auf ein Trennzeichen -
aufteilt. Nach dem Splitten des Strings werden die Werte der Variablen IP
zugewiesen.
Dann durchläuft die for
-Schleife die Variable $IP
und gibt alle Werte mit dem echo
-Befehl aus.
#!/usr/bin/env bash
addrs="192.168.8.1-192.168.8.2-192.168.8.3-192.168.8.4"
IP=$(echo $addrs | tr "-" "\n")
for ip in $IP
do
echo "$ip"
done
Die folgende Ausgabe zeigt, dass die String-Variable $addr
am Trennzeichen -
in 4 separate Strings aufgeteilt wurde.
192.168.8.1
192.168.8.2
192.168.8.3
192.168.8.4
Verwenden von IFS
zum Aufteilen einer Zeichenkette in Bash
IFS
steht für Internal Field Separator
.
Das IFS
wird zum Aufteilen von Wörtern nach der Erweiterung und zum Aufteilen von Zeilen in Wörter mit dem eingebauten read
-Befehl verwendet. Der Wert von IFS
sagt der Shell, wie sie Wortgrenzen erkennt.
Der Standardwert des IFS
ist ein Leerzeichen, ein Tabulator und eine neue Zeile. Im folgenden Skript wurde der ursprüngliche Wert des IFS
in der Variablen OIFS
gespeichert und der neue Wert IFS
auf -
gesetzt.
Das bedeutet, dass die Shell -
als neue Wortgrenze behandeln sollte. Die Shell teilt die String-Variable addrs
auf -
und weist die neuen Werte der Variablen ips
zu.
Dann durchläuft die for
-Schleife die Variable $ips
und gibt alle Werte mit dem echo
-Befehl aus.
IFS=$OIFS
wird verwendet, um den ursprünglichen Wert der IFS
-Variable wiederherzustellen, und unset OIFS
weist die Shell an, die Variable OIFS
aus der Liste der Variablen zu entfernen, die sie verfolgt.
#!/usr/bin/env bash
addrs="192.168.8.1-192.168.8.2-192.168.8.3-192.168.8.4"
OIFS=$IFS
IFS='-'
ips=$addrs
for ip in $ips
do
echo "$ip"
done
IFS=$OIFS
unset OIFS
Die folgende Ausgabe zeigt, dass die String-Variable $addr
am Trennzeichen -
in 4 separate Strings aufgeteilt wurde.
192.168.8.1
192.168.8.2
192.168.8.3
192.168.8.4
Verwenden des Befehls read
zum Teilen einer Zeichenkette in Bash
Der Befehl read
ist ein eingebauter Befehl auf Linux-Systemen.
Es wird verwendet, um den Inhalt einer Zeile in eine Variable einzulesen. Es teilt auch Wörter einer Zeichenkette, die einer Shell-Variablen zugewiesen ist.
Die Variable $addrs
wird an den read
-Befehl im unten stehenden Skript übergeben. Das IFS
setzt das Trennzeichen, das als Wortgrenze für die String-Variable dient.
Das bedeutet, dass das -
in unserem Fall die Wortgrenze ist. Die Option -a
weist den Befehl read
an, die Wörter, die in ein Array aufgeteilt wurden, zu speichern, während die Option -r
den Befehl read
anweist, alle Escape-Zeichen so zu behandeln, wie sie sind, und sie nicht zu interpretieren.
Die aufgespaltenen Wörter werden im Array IP
gespeichert. Die for
-Schleife durchläuft das Array $IP
und gibt alle Werte mit dem echo
-Befehl aus.
#!/usr/bin/env bash
addrs="192.168.8.1-192.168.8.2-192.168.8.3-192.168.8.4"
IFS='-' read -ra IP <<< "$addrs"
for ip in "${IP[@]}";
do
echo "$ip"
done
An der Ausgabe unten können wir erkennen, dass die String-Variable $addr
am Trennzeichen -
in 4 separate Strings aufgeteilt wurde.
192.168.8.1
192.168.8.2
192.168.8.3
192.168.8.4
Verwenden der Parametererweiterung zum Teilen eines Strings in Bash
Das folgende Skript verwendet die Parametererweiterung, um Zeichen zu suchen und zu ersetzen. Die Syntax für die Parametererweiterung ist ${variable//search/replace}
. Dieser sucht nach einem Muster, das mit search
in der Variablen
übereinstimmt und ersetzt es durch replace
.
In unserem Fall sucht das Skript nach dem Muster -
und ersetzt es durch Leerzeichen. Die Klammern um ${addrs//-/ }
werden verwendet, um ein Array des neuen Strings namens ip_array
zu definieren.
Mit der for
-Schleife iterieren wir über alle Elemente der ip_array
-Variablen und zeigen sie mit dem echo
-Befehl an.
#!/usr/bin/env bash
addrs="192.168.8.1-192.168.8.2-192.168.8.3-192.168.8.4"
ip_array=(${addrs//-/ })
for ip in "${ip_array[@]}"
do
echo "$ip"
done
Die folgende Ausgabe zeigt alle Elemente im ip_array
.
192.168.8.1
192.168.8.2
192.168.8.3
192.168.8.4
Auf einzelne Elemente der Variable ip_array
können wir durch Übergabe des Index zugreifen. Im folgenden Skript haben wir den Index 0
übergeben, um auf das erste Element im Array zu verweisen.
#!/usr/bin/env bash
addrs="192.168.8.1-192.168.8.2-192.168.8.3-192.168.8.4"
ip_array=(${addrs//-/ })
printf "${ip_array[0]}\n"
Die Ausgabe zeigt das erste Element des ip_array
.
192.168.8.1
Verwenden des Befehls cut
zum Teilen einer Zeichenkette in Bash
Das folgende Skript verwendet den Befehl cut
, um einen Teilstring zu extrahieren. Die Option -d
gibt das Trennzeichen an, mit dem die Zeichenkette in Felder unterteilt wird, und die Option -f
legt die Nummer des zu extrahierenden Felds fest.
Aber die Zeichenkette wird in unserem Fall mit -
als Trennzeichen geteilt, und um auf das erste Feld zuzugreifen, übergeben wir das Argument 1
an die Option -f
, und wir machen dasselbe, um auf das zweite Feld zuzugreifen, indem wir Übergabe von 2
an die Option -f
.
Die Werte werden den Variablen ip_one
bzw. ip_two
zugewiesen. Mit dem Befehl printf
werden die Werte der Variablen angezeigt.
#!/usr/bin/env bash
addrs="192.168.8.1-192.168.8.2-192.168.8.3-192.168.8.4"
ip_one=$(echo $addrs | cut -d '-' -f 1)
ip_two=$(echo $addrs | cut -d '-' -f 2)
printf "$ip_one\n$ip_two\n"
Die folgende Ausgabe zeigt den ersten und zweiten String, die von der String-Variablen $addrs
getrennt wurden.
192.168.8.1
192.168.8.2