bash - bash如何将str作为分隔符分割?

  显示原文与译文双语对照的内容

如何根据Bash中的分隔符拆分字符串?

我将这里字符串存储在变量中:


IN="bla@some.com;john@home.com"

现在,我想用 ; 分隔符分割字符串,这样我就有了:


ADDR1="bla@some.com"
ADDR2="john@home.com"

我不需要 ADDR1ADDR2 变量。 如果它们是一个数组的元素,甚至更好。


下面提供的建议答案,最终得到的却是以下这就是我was:后在后,


#!/usr/bin/env bash

IN="bla@some.com;john@home.com"

arr=$(echo $IN | tr";""n")

for x in $arr
do
 echo"> [$x]"
done

输出:


> [bla@some.com]
> [john@home.com]

有一个解决方案涉及将 Internal_field_separator ( IFS ) 设置为 ; 。 我不知道这个答案发生了什么,你如何将 IFS 复位为默认值?

回复:IFS 解决方案,我尝试使用这种有效果我保留原有 IFS 然后还原它:


IN="bla@some.com;john@home.com"

OIFS=$IFS
IFS=';'
arr2=$IN
for x in $arr2
do
 echo"> [$x]"
done

IFS=$OIFS

,当我尝试时

 
arr2=($IN) 

 

在循环中打印它时,我只得到第一个字符串,在 $IN 周围没有括号。

时间:

你可以设置内部字段分隔符 ( IFS ) 变量,然后让它解析为数组。 在命令中发生这种情况时,对 IFS的赋值只发生在命令( 到 read )的单个环境中。 然后,它根据 IFS 变量值解析输入到一个数组中,然后我们可以迭代。


IFS=';' read -ra ADDR <<<"$IN"
for i in"${ADDR[@]}"; do
 # process"$i"
done

它将解析由 ; 分隔的一行项,将它的推入数组。 用于处理整个 $IN的内容,每次输入一行由 ; 分隔:


 while IFS=';' read -ra ADDR; do
 for i in"${ADDR[@]}"; do
 # process"$i"
 done
 done <<<"$IN"

取自 bashshell脚本拆分数组:


IN="bla@some.com;john@home.com"
arrIN=(${IN//;/})

英镑解释: 这里构造将字符串 IN 中的所有 ';' ( 初始 // 表示全局替换) 替换为 '' ( 单个空格),然后将space-delimited字符串解释为数组( 周围的括号就是这样做的) 。

处理变量内容的过程称为参数展开

如果你不介意立即处理它们,我想这样做:


for i in $(echo $IN | tr";""n")
do
 # process
done

你可以使用这种循环来初始化数组,但是可能有一个更简单的方法。 希望这能帮到你。

方法如何:


IN="bla@some.com;john@home.com" 
set --"$IN" 
IFS=";"; declare -a Array=($*) 
echo"${Array[@]}" 
echo"${Array[0]}" 
echo"${Array[1]}" 

这里操作也适用:


IN="bla@some.com;john@home.com"
echo ADD1=`echo $IN | cut -d ; -f 1`
echo ADD2=`echo $IN | cut -d ; -f 2`

小心,这个解决方案并不总是正确的。 如果你只通过"bla@some.com",它将把它分配给ADD1和 ADD2.

另一个将回答变得与 darron,这里我才这样:


IN="bla@some.com;john@home.com"
read ADDR1 ADDR2 <<<$(IFS=";"; echo $IN)

我认为 AWK 是解决问题的最佳命令。 在几乎所有的Linux发行版中,在Bash中都包含了 AWK 。


echo"bla@some.com;john@home.com" | awk -F';' '{print $1,$2}'

将给予


bla@some.com john@home.com

当然,你可以通过重新定义awk打印字段来存储每个电子邮件地址。

...