Bash拆分字符串

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 zyiz!",则输出如下所示:

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

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

Bash脚本代码

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

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

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

执行上面示例代码,得到以下结果: