如何在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 ";" "n")

for addr in $mails
do
    echo "> [$addr]"
done

输出:

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

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

RE: 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左右括号。


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

采用Bash shell脚本分割数组:

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

说明:

这种构造取代了所有的';' (初始//串中表示全局替换) IN' ' (一个空格),然后解释空间分隔的字符串作为数组(这是周围的括号做)。

花括号内用来替换每个';'的语法 带有' '字符的字符称为参数扩展。

有一些常见的陷阱:

  • 如果原始字符串有空格,则需要使用IFS:
  • IFS=':'; arrIN=($IN); unset IFS;
  • 如果原始字符串中包含空格且分隔符是新行,则可以使用以下内容设置IFS:
  • IFS=$'n'; arrIN=($IN); unset IFS;

  • 如果你不介意处理它们,我喜欢这样做:

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

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

    链接地址: http://www.djcxy.com/p/4127.html

    上一篇: How do I split a string on a delimiter in Bash?

    下一篇: How do I remove all .pyc files from a project?