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 yiibai!",則輸出如下所示:

範例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="WeLearnWelcomeLearnYouLearnOnLearnYiibai"  
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@yiibai:~/bashcode$ vi split-bash.sh
maxsu@yiibai:~/bashcode$ chmod u+x split-bash.sh 
maxsu@yiibai:~/bashcode$ ./split-bash.sh 
declare -a array=([0]="We" [1]="Welcome" [2]="You" [3]="On" [4]="Yiibai")

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

Bash指令碼程式碼

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

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

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

執行上面範例程式碼,得到以下結果: