gpt4 book ai didi

arrays - 如何从命令输出的行创建一个数组

转载 作者:行者123 更新时间:2023-11-29 09:16:05 25 4
gpt4 key购买 nike

我有一个名为 failedfiles.txt 的文件,其中包含以下内容:

failed1
failed2
failed3

我需要使用 grep 返回该文件中每一行的内容,并将输出保存在要访问的列表中。所以我想要这样的东西:

temp_list=$(grep "[a-z]" failedfiles.txt)

但是,问题是当我输入

echo ${temp_list[0]}

我得到以下输出:

failed1 failed2 failed3

但我想要的是当我这样做的时候:

echo ${temp_list[0]}

打印

failed1

当我这样做的时候:

echo ${temp_list[1]}

打印

failed2

谢谢。

最佳答案

@devnull 的有用回答解释了为什么您的代码没有按预期工作:命令替换总是返回一个单个字符串(可能由多行组成)。

但是,简单地把(...)如果命令输出的行没有嵌入空格,围绕命令替换创建一个数组将仅按预期工作 - 否则,每个单独的(以空格分隔的)单词将成为它自己的数组元素。


一次捕获命令输出行,在数组中:

要捕获数组中任意命令输出的行,请使用以下命令:

  • bash < 4(例如,在 OS X 10.9.2 之后的 OSX 上):使用 read -a
IFS=$'\n' read -rd '' -a linesArray <<<"$(grep "[a-z]" failedfiles.txt)"
  • bash >= 4:使用 readarray :
readarray -t linesArray <<<"$(grep "[a-z]" failedfiles.txt)"

注意:

  • <<<发起一个所谓的here-string , 它通过 stdin 将右侧的字符串(恰好是此处命令替换的结果)通过管道传输到左侧的命令中.
    • 同时 command <<< string在功能上等同于 echo string | command原则上,关键区别在于后者创建了 子壳,它在 command 中进行变量赋值。毫无意义 - 它们被本地化到每个子 shell。
  • 将 here-strings 与命令替换相结合的替代方法是 [input] process substitution - <(...) - 简而言之,允许使用命令的输出,就好像它是输入文件一样;相当于<<<"$(command)"< <(command) .
  • read : -a读入数组,IFS=$'\n'确保每一行都被视为一个单独的字段,从而读入其自己的数组元素; -d ''确保一次读取所有行(在将它们分成字段之前); -r关闭输入中转义序列的解释。
  • readarray (也可调用为 mapfile )直接将输入行分成行数组; -t确保终止 \n不包含在数组元素中。

在命令输出行上循环:

如果不需要一次捕获数组中的所有行并且逐行循环命令的输出就足够了,请使用以下命令:

while IFS= read -r line; do
# ...
done < <(grep "[a-z]" failedfiles.txt)
  • IFS=确保每一行在空白方面都是未经修改的;删除它以修剪前导和尾随空格。
  • -r确保在看起来像转义序列的输入子字符串中读取“原始”行 - 例如,\t - 不这样解释。
  • 请注意使用 [input] 进程替换(如上所述)将命令输出作为输入提供给 read循环。

关于arrays - 如何从命令输出的行创建一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22776201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com