如何在 Bash 的分隔符上拆分字符串?

如何解决如何在 Bash 的分隔符上拆分字符串?

您可以设置内部字段分隔符(IFS) 变量,然后让它解析成一个数组。当这发生在命令中时,分配 toIFS只发生在该单个命令的环境 (to 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//;/ })
echo ${arrIN[1]}                  # Output: john@home.com

解释:

此构造用(单个空格)替换字符串中所有出现的';'(初始//表示全局替换),然后将空格分隔的字符串解释为数组(这就是周围括号的作用)。IN``' '

花括号内用于将每个';'字符替换为' '字符的语法称为参数扩展

有一些常见的陷阱:

  1. 如果原始字符串有空格,则需要使用IFS

  2. IFS=':'; arrIN=($IN); unset IFS;

  3. 如果原始字符串有空格并且分隔符是新行,则可以使用以下方式设置IFS

  4. IFS=$'\n'; arrIN=($IN); unset IFS;

解决方法

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

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

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

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

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


根据以下答案的建议,我最终得到了以下结果:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?