如何使用 IFS 和 read 或任何其他方法将长字符串分成字符串数组

如何使用 IFS 和 read 或任何其他方法将长字符串分成字符串数组

我有一长行是 git 命令的输出:a=$(git submodule foreach git status)。它看起来像这样:a =“输入'目录1/子目录' 在分支 master 上您的分支已更新为“origin/master”。没有什么可提交的,工作树干净输入'目录2' HEAD 在 xxxxxx 处分离,无需提交任何内容,工作树干净输入'目录3' 在分支 master 上您的分支已更新为“origin/master”。没有什么可提交的,工作树干净输入'目录4' 在分支 master 上您的分支已更新为“origin/master”。没有什么可承诺的,工作树干净”

我想将它分成一个数组:

ARR[0] = "'目录1/子目录’关于分部主...”

ARR[1] = "'目录2’头脱离了……”

ETC。

为此,我尝试用“Entering”代替符号(我尝试过 # $ % & \t ...),并且a=${a//Entering /$}它工作正常。然后,我尝试使用 IFS 并读取将其分成数组:IFS='$' read -ra ARR <<< "$a"

这就是我面临问题的地方。

我得到的输出echo ${ARR[@]}是“Dir1/Subdir1”,所以我认为读取受到空格或 git 输出方式的影响,但我不明白发生了什么以及如何修复它。您能给我一些建议吗?

谢谢。

答案1

您可以使用readarraybash 内置命令并在同一命令中指定分隔符:

readarray -d 'char delimiter' array <<< $variable

例如:

readarray -d '@' array <<< ${a//Entering /@}

最后,当您打印每个结果时,您可能需要删除@(或用作分隔符的任何其他字符):

echo ${array[1]%@}
echo ${array[2]%@}
echo ${array[@]%@}

如果您想删除索引0(因为它包含@),您可以通过将项目从索引复制到最后一个索引来重新分配数组1

array=("${array[@]:1}")

提示:如果您想避免${array[index]%@}每次想要获取某些项目时都使用该数组,可以通过删除@with 来重新分配数组:

array=("${array[@]/@}")

相关内容