在 Bash 中拆分字串

Fumbani Banda 2023年1月30日
  1. 在 Bash 中使用 tr 命令拆分字串
  2. 在 Bash 中使用 IFS 拆分字串
  3. 在 Bash 中使用 read 命令拆分字串
  4. 在 Bash 中使用引數擴充套件拆分字串
  5. 在 Bash 中使用 cut 命令拆分字串
在 Bash 中拆分字串

本教程演示了在 bash 中使用 tr 命令、IFSread 命令、引數擴充套件和 cut 命令在分隔符上拆分字串。

在 Bash 中使用 tr 命令拆分字串

tr 命令是 translate 的縮寫形式。它從標準輸入中翻譯、刪除和壓縮字元,並將結果寫入標準輸出。

這是在命令列或 bash 指令碼中操作文字的有用命令。可以去除重複字元,小寫轉大寫,替換字元。

在下面的 bash 指令碼中,echo 命令通過管道將字串變數 $addrs 傳送到 tr 命令,該命令在分隔符 - 上拆分字串變數。一旦字串被拆分,這些值就會分配給 IP 變數。

然後,for 迴圈遍歷 $IP 變數並使用 echo 命令列印出所有值。

#!/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

下面的輸出顯示 $addr 字串變數已在分隔符 - 上拆分為 4 個單獨的字串。

192.168.8.1
192.168.8.2
192.168.8.3
192.168.8.4

在 Bash 中使用 IFS 拆分字串

IFS 代表內部欄位分隔符。

IFS 用於擴充套件後的單詞拆分,並使用內建的 read 命令將行拆分為單詞。IFS 的值告訴 shell 如何識別單詞邊界。

IFS 的預設值是一個空格、一個製表符和一個新行。在下面的指令碼中,IFS 的原始值已儲存在 OIFS 變數中,而新的 IFS 值已設定為 -

這意味著 shell 應該將 - 作為新詞的邊界。shell 在 - 上拆分字串變數 addrs,並將新值分配給 ips 變數。

然後,for 迴圈遍歷 $ips 變數並使用 echo 命令列印出所有值。

IFS=$OIFS 用於恢復 IFS 變數的原始值,並且 unset OIFS 告訴 shell 從它跟蹤的變數列表中刪除變數 OIFS

#!/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

下面的輸出顯示 $addr 字串變數已在分隔符 - 上拆分為 4 個單獨的字串。

192.168.8.1
192.168.8.2
192.168.8.3
192.168.8.4

在 Bash 中使用 read 命令拆分字串

read 命令是 Linux 系統上的內建命令。

它用於將一行的內容讀入變數。它還拆分分配給 shell 變數的字串的單詞。

變數 $addrs 字串被傳遞給下面指令碼中的 read 命令。IFS 設定作為字串變數的單詞邊界的分隔符。

這意味著 - 在我們的例子中是單詞邊界。-a 選項告訴 read 命令將已拆分的單詞儲存到陣列中,而 -r 選項告訴 read 命令按原樣處理任何轉義字元而不解釋它們。

已拆分的單詞儲存在 IP 陣列中。for 迴圈遍歷 $IP 陣列並使用 echo 命令列印出所有值。

#!/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

從下面的輸出中,我們可以觀察到 $addr 字串變數已在分隔符 - 上拆分為單獨的 4 個字串。

192.168.8.1
192.168.8.2
192.168.8.3
192.168.8.4

在 Bash 中使用引數擴充套件拆分字串

下面的指令碼使用引數擴充套件來搜尋和替換字元。用於引數擴充套件的語法是 ${variable//search/replace}。這將搜尋與 variable 中的 search 匹配的模式,並將其替換為 replace

在我們的例子中,指令碼搜尋模式 - 並將其替換為空白。${addrs//-/ } 周圍的括號用於定義新字串的陣列,稱為 ip_array

我們使用 for 迴圈遍歷所有 ip_array 變數元素並使用 echo 命令顯示它們。

#!/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

下面的輸出顯示了 ip_array 中的所有元素。

192.168.8.1
192.168.8.2
192.168.8.3
192.168.8.4

我們可以通過傳入索引來訪問 ip_array 變數的各個元素。在下面的指令碼中,我們傳遞了索引 0 來引用陣列中的第一個元素。

#!/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"

輸出顯示 ip_array 的第一個元素。

192.168.8.1

在 Bash 中使用 cut 命令拆分字串

下面的指令碼使用 cut 命令來提取子字串。-d 選項指定用於將字串劃分為欄位的分隔符,而 -f 選項設定要提取的欄位的編號。

但是在我們的例子中,字串使用 - 作為分隔符進行分割,為了訪問第一個欄位,我們將引數 1 傳遞給 -f 選項,我們執行相同的操作來訪問第二個欄位將 2 傳遞給 -f 選項。

這些值分別分配給 ip_oneip_two 變數。printf 命令用於顯示變數的值。

#!/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"

下面的輸出顯示從 $addrs 字串變數拆分的第一個和第二個字串。

192.168.8.1
192.168.8.2
作者: Fumbani Banda
Fumbani Banda avatar Fumbani Banda avatar

Fumbani is a tech enthusiast. He enjoys writing on Linux and Python as well as contributing to open-source projects.

LinkedIn GitHub

相關文章 - Bash String