如何在Bash中使用分隔符拆分字符串?

49 浏览
0 Comments

如何在Bash中使用分隔符拆分字符串?

我有一个字符串存储在变量中:

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

现在我想通过分隔符;拆分字符串,使得我有:

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

我不一定需要ADDR1ADDR2变量。如果它们是数组的元素,那就更好了。


在下面的回答建议之后,我得到了以下的结果,这就是我想要的:

#!/usr/bin/env bash
IN="bla@some.com;john@home.com"
mails=$(echo $IN | tr ";" "
")
for addr in $mails
do
    echo "> [$addr]"
done

输出:

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

有一个解决方案涉及设置Internal_field_separator(IFS)为;。我不确定那个答案发生了什么,如何将IFS重置回默认值?

关于IFS解决方案,我尝试了这个方法,它可以工作,我保留旧的IFS,然后恢复它:

IN="bla@some.com;john@home.com"
OIFS=$IFS
IFS=';'
mails2=$IN
for x in $mails2
do
    echo "> [$x]"
done
IFS=$OIFS

顺便说一句,当我尝试

mails2=($IN)

在循环中打印时,只得到了第一个字符串,没有在$IN周围加上括号,它可以工作。

admin 更改状态以发布 2023年5月21日
0
0 Comments

这段内容来自于Bash shell script split array

IN="bla@some.com;john@home.com"
arrIN=(${IN//;/ })
echo ${arrIN[1]}                  # Output: john@home.com

解释:

这个语法将字符串IN中所有的';'(初始的//表示全局替换)替换成单个空格' ',然后将空格分隔的字符串解释为一个数组(这就是括号的作用)。

在大括号内使用的语法,将每个';'字符替换为' '字符的方法被称为参数展开

有一些常见的坑点:

  1. 如果原始字符串中有空格,则需要使用IFS
  • IFS=':'; arrIN=($IN); unset IFS;
  1. 如果原始字符串中有空格,且分隔符是换行符,则可以使用IFS
  • IFS=$'\n'; arrIN=($IN); unset IFS;
0
0 Comments

你可以设置内部字段分隔符(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"

0