在 Bash 中拆分字串
-
在 Bash 中使用
tr
命令拆分字串 -
在 Bash 中使用
IFS
拆分字串 -
在 Bash 中使用
read
命令拆分字串 - 在 Bash 中使用引數擴充套件拆分字串
-
在 Bash 中使用
cut
命令拆分字串
本教程演示了在 bash 中使用 tr
命令、IFS
、read
命令、引數擴充套件和 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_one
和 ip_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