📜  Bash拆分字符串

📅  最后修改于: 2020-12-29 10:20:24             🧑  作者: Mango

重击拆分字符串

在本主题中,我们定义了如何在bash shell脚本中拆分字符串。

在某些情况下,我们可能需要拆分字符串数据以执行某些特定任务。大多数编程语言都包含内置函数“ split”,可将任何字符串数据分为多个部分。但是,bash不包含此类内置函数。但是我们可以使用定界符在bash脚本中拆分任何字符串数据。分隔符可以是单个字符,也可以是具有多个字符的字符串。

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

使用$ IFS变量拆分

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

  • $ IFS是一个特殊的内部变量,用于将字符串拆分为单词。 $ IFS变量称为“内部字段分隔符”,它确定Bash如何识别边界。 $ IFS用于分配特定的分隔符[ IFS =' ' ]分割字符串。空格是$ IFS的默认值。但是,我们也可以使用'\ t','\ n','-'等值作为分隔符。
  • 分配定界符后,可以通过两个选项读取字符串:“-r”和“ -a”。即,读取-ra ARR <<<“ $ str” 。在这里,选项'-r'用于定义反斜杠(\)是字符而不是转义字符。 “ -a”选项用于定义将单词(用$ IFS分隔)分配给从零开始的数组顺序索引。
  • 然后,我们应用bash'for'循环来访问令牌,这些令牌被拆分为一个数组。

让我们借助一些示例来了解这种机制:

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

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

Bash脚本

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

输出量

如果我们输入字符串“ Javatpoint上欢迎您”,则输出将如下所示:

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

在某些情况下,我们可能需要用其他定界符(例如符号或特定字符)来分割字符串。在本示例中,使用逗号(,)符号字符作为分隔符来分割字符串。

Bash脚本

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

read -p "Enter Name, State 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 "State : ${strarr[1]} "
echo "Age : ${strarr[2]}"

输出量

不带$ IFS变量的拆分

在bash中,也可以在不使用$ IFS变量的情况下分割字符串。带-d选项的'readarray'命令用于拆分字符串数据。 -d选项适用于在命令中定义分隔字符,例如$ IFS。此外,bash循环用于以拆分形式print字符串。

让我们借助一些示例来了解此逻辑:

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

本示例定义了如何在不使用$ IFS的情况下拆分字符串值。根据脚本,应使用冒号(:)输入文本值,以便将其拆分。查看以下bash脚本:

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="WeLearnWelcomeLearnYouLearnOnLearnJavatpoint"
delimiter=Learn
s=$str$delimiter
array=();
while [[ $s ]];
do
array+=( "${s%%"$delimiter"*}" );
s=${s#*"$delimiter"};
done;
declare -p array

在此bash脚本中,我们使用了以下Parameter- Expansions:

  • $ {parameter %% word}删除最长匹配的后缀模式。
  • $ {parameter#word}删除最短匹配的前缀模式。

输出量

示例3:使用Trim命令重击分割字符串

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

Bash脚本

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

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

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

输出量


注意:应该注意的是,如果我们应用trim命令分割字符串,数组元素将在'space delimiter'上分割。例如,“ Windows OS”之类的元素将被视为两个不同的词。

结论

在本主题中,我们演示了如何在bash脚本中使用不同类型的方案(或不使用定界符)拆分字符串。