Bash 和 IFS:根据完整的词项将字符串拆分为具有特定分隔符的数组

Bash and IFS: string split to an array with specific separator based on a complete word-term

使用以下代码:

string="[Git status]^functionGitStatus"
IFS='^' read -r -a array <<< "$string"
echo "${array[@]}"
echo "size: '${#array[@]}'"
for e in "${array[@]}"; do
   echo "'$e'"
done

它按预期工作并显示:

[Git status] functionGitStatus
size: '2'
'[Git status]'
'functionGitStatus'

我确实做过研究,例如在

可以使用 , (带空 space 的命令)

如果我尝试完成相同的方法:

string="[Git status]^ functionGitStatus"
IFS='^ ' read -r -a array <<< "$string"
echo "${array[@]}"
echo "size: '${#array[@]}'"
for e in "${array[@]}"; do
   echo "'$e'"
done

我得到了:

[Git status] functionGitStatus
size: '3'
'[Git'
'status]'
'functionGitStatus'

遗憾的是没有如预期的那样(即使 ^ 只出现一次)

我想知道是否可以使用完整的词项作为分隔符,例如:

string="[Git status]-fn:-functionGitStatus"
IFS='-fn:-' read -r -a array <<< "$string"
echo "${array[@]}"
echo "size: '${#array[@]}'"
for e in "${array[@]}"; do
   echo "'$e'"
done

但是它显示:

[Git status]      u ctio GitStatus
size: '9'
'[Git status]'
''
''
''
''
''
'u'
'ctio'
'GitStatus'

似乎不​​可能,或者可能有一个特殊的标志来解释如何完整的词项。如果不可能,在这种情况下还有什么其他功能可以提供帮助?

使用 bash 参数扩展和 mapfile:

$ string='[Git status]-fn:-functionGitStatus'
$ mapfile -t array <<< "${string//-fn:-/$'\n'}"
$ echo "${array[@]}"
[Git status] functionGitStatus
$ echo "size: '${#array[@]}'"
2
$ for e in "${array[@]}"; do echo "'$e'"; done
'[Git status]'
'functionGitStatus'

解释:"${string//-fn:-/$'\n'}" 是一个 bash 参数扩展替换:所有(因为 // 而不是 /-fn:- [=16 中的子字符串=] 替换为 $'\n',即换行符($'...' 语法记录在 bash 手册的 QUOTING 部分中。 <<< 是 here-string 重定向运算符。它将带替换的参数扩展的结果“提供”给 mapfile 命令。 mapfile -t array(也记录在 bash 手册中)将其输入存储在名为 array 的 bash 数组中,每个单元格一行,删除结尾的换行符(-t选项)。