如何在Bash脚本中拆分字符串

时间:2020-03-05 15:31:40  来源:igfitidea点击:

假设我们有一个长长的字符串,用逗号或者下划线分隔几个单词。
我们希望拆分此字符串并提取单个单词。

我们可以使用内部字段分隔符(ifs)和读取命令在Bash中拆分字符串,也可以使用TR命令。

让我向我们展示如何用例子来做。

方法1:使用Bash中的读命令拆分字符串

以下是使用读取命令拆分字符串的示例脚本:

#!/bin/bash
## Script to split a string based on the delimiter
my_string="Ubuntu;Linux Mint;Debian;Arch;Fedora"
IFS=';' read -ra my_array <<< "$my_string"
#Print the split string
for i in "${my_array[@]}"
do
    echo $i
done

拆分字符串的部分在此处:

IFS=';' read -ra my_array <<< "$my_string"

让我向你解释一下。
ifs确定要拆分字符串的分隔符。
在我的情况下,这是一个半冒号。
它可能是你想要的任何东西,如空间,标签,逗号甚至是一封信。

read命令中的ifs在分隔符处拆分输入。
读取命令读取原始输入(选项-r),从而详细解释反斜杠,而不是将它们视为转义字符。
具有读取命令的选项-a将单词存储在Bash中的数组中。

更简单的单词,长字符串被分成几个由分隔符分隔的单词,这些单词存储在数组中。

现在,我们可以访问数组以获取我们想要的任何字,或者在Bash中使用for循环以将所有单词逐个打印,因为我在上面的脚本中完成了一个。

这是上面脚本的输出:

Ubuntu
Linux Mint
Debian
Arch
Fedora

方法2:使用BASH中的TR命令拆分字符串

这是使用tr(translate)命令的bash拆分字符串示例:

#!/bin/bash
## Script to split a string based on the delimiter
my_string="Ubuntu;Linux Mint;Debian;Arch;Fedora"  
my_array=($(echo $my_string | tr ";" "\n"))
#Print the split string
for i in "${my_array[@]}"
do
    echo $i
done

这个例子几乎与前一个相同。
tr命令而不是read命令用于拆分分隔符上的字符串。

这种方法的问题是阵列元素划分为"空间分隔符"。
因此,"Linux Mint"等元素将被视为两个单词。

这是上面脚本的输出:

Ubuntu
Linux
Mint
Debian
Arch
Fedora

这就是为什么我更喜欢在Bash中拆分字符串的第一个方法的原因。