Bash拆分字串

在本文中,將演示如何在bash shell腳本中拆分字串。

在某些情況下,可能需要拆分字串數據以執行某些特定任務。大多數編程語言都包含內置功能“split”,可將任何字串數據分為多個部分。但是,bash不包含此類內置函數。但是可以使用定界符在bash腳本中拆分任何字串數據。分隔符號可以是單個字元,也可以是包含多個字元的字串。

查看以下方法,瞭解如何在bash shell中分割字串:

1. 使用$IFS變數分割

以下是使用$IFS在bash中拆分字串的步驟:

  • $IFS是一個特殊的內部變數,用於將字串拆分為單詞。$IFS變數稱為“內部字段分隔符號”,它確定Bash如何識別邊界。$IFS用於分配分隔字串的特定定界符[IFS ='']。空格是$IFS的默認值。但是,也可以使用\t\n-等值作為分隔符號。
  • 分配定界符後,可以通過兩個選項讀取字串:-r-a。即,read -ra ARR <<< "$str"。在這裏,選項-r用於定義反斜杠(\),它是字元而不是轉義字元。-a選項用於定義將單詞(用$IFS分隔)分配給從零開始的數組順序索引。
  • 然後,應用bash for迴圈來訪問令牌,這些令牌被拆分為一個數組。

下麵通過一些示例來瞭解這種機制:

示例1:Bash按空格分割字串

在此示例中,使用空格字元定界符分割字串。

Bash腳本檔:split-demo1.sh

#!/bin/bash
#Example for bash split string by space

read -p "Enter any string separated by space: " str  #reading string value

IFS=' ' #setting space as delimiter
read -ra ADDR <<<"$str" #reading str as an array as tokens separated by IFS

for i in "${ADDR[@]}"; #accessing each element of array
do
echo "$i"
done

如果輸入字串"welcome to zaixian!",則輸出如下所示:

示例2:Bash按符號分割字串

在某些情況下,可能需要用其他定界符(例如符號或特定字元)來分割字串。在本示例中,使用逗號(,)符號字元作為分隔符號來分割字串。

Bash腳本代碼:

#!/bin/bash
#Example for bash split string by Symbol (comma)

read -p "Enter Name, City and Age separated by a comma: " entry #reading string value

IFS=',' #setting comma as delimiter
read -a strarr <<<"$entry" #reading str as an array as tokens separated by IFS

echo "Name : ${strarr[0]} "
echo "City : ${strarr[1]} "
echo "Age : ${strarr[2]}"

執行上面示例代碼,得到以下結果:

2. 不使用$IFS變數分割

在bash中,也可以在不使用$IFS變數的情況下分割字串。使用readarray命令帶-d選項來拆分字串數據。-d選項適用於在命令中定義分隔符號,例如$IFS。此外,bash迴圈用於以拆分形式列印字串。

下麵通過一些示例來瞭解此邏輯:

示例1:Bash按符號分割字串

本示例演示如何在不使用$IFS的情況下拆分字串值。使用冒號(:)輸入文本值,以便將其拆分。閱讀下麵的bash腳本代碼:

#!/bin/bash
#Example for bash split string without $IFS

read -p "Enter any string separated by colon(:) " str #reading string value

readarray -d : -t strarr <<<"$str" #split a string based on the delimiter ':'

printf "\n"

#Print each value of Array with the help of loop
for (( n=0; n < ${#strarr[*]}; n++ ))
do
echo "${strarr[n]}"
done

執行上面示例代碼,得到以下結果:

示例2:使用字串拆分字串

在此示例中,將使用慣用運算式 - 參數擴展。

Bash腳本代碼

#!/bin/bash
#Example for bash split string by another string

str="WeLearnWelcomeLearnYouLearnOnLearnzaixian"
delimiter=Learn
s=$str$delimiter
array=();
while [[ $s ]];
do
array+=( "${s%%"$delimiter"*}" );
s=${s#*"$delimiter"};
done;
declare -p array

在此bash腳本中,使用了以下參數擴展:

  • ${s%%"$delimiter"*} - 它刪除最長的匹配尾碼模式。
  • ${s#*"$delimiter"} - 它刪除最短的匹配首碼模式。

執行上面示例代碼,得到以下結果:

maxsu@zaixian:~/bashcode$ vi split-bash.sh
maxsu@zaixian:~/bashcode$ chmod u+x split-bash.sh
maxsu@zaixian:~/bashcode$ ./split-bash.sh
declare -a array=([0]="We" [1]="Welcome" [2]="You" [3]="On" [4]="zaixian")

示例3:使用Trim命令分割字串
在此示例中,我們使用trim(tr)命令分割字串。trim命令不是使用read命令,而是用於在定界符上拆分字串。

Bash腳本代碼

#!/bin/bash
#Example to split a string using trim (tr) command

my_str="We;welcome;you;on;zaixian!"
my_arr=($(echo $my_str | tr ";" "\n"))

for i in "${my_arr[@]}"
do
echo $i
done

執行上面示例代碼,得到以下結果:


上一篇: Bash查找字串 下一篇: Bash提取子字串