如何基于bash中的元素值拆分数组

时间:2018-12-03 22:59:24

标签: bash

我有一个数组,说a=(one two three split_array four five)。我需要根据已知的子字符串split_array找到split,最后得到所有在它之前的项目,即one two three。是否有任何方法可以通过使用参数替换来实现。我可以使用循环来实现,但是正在寻找更智能的方式来实现这一目标。

2 个答案:

答案 0 :(得分:1)

我不确定这是否很聪明,但是您可以一次将数组连接成字符串并对其执行参数替换:

declare -a a=(one two three split_array four five)
b="${a[*]}"
declare -a c=( ${b%% split_array*} )
for i in ${c[@]}; do
    echo "$i"
done

输出:

one
two
three
  • b="${a[*]}"将数组的元素合并为以空格分隔的字符串
  • ${b%% split_array*}删除$ b的模式“ split_array *”

请注意,上面的脚本基于以下假设:数组的元素不包含IFS字符。

在这种情况下,您可以将IFS修改为数组元素中可能不使用的字符,例如转义字符:

ESC=$'\e'       # the escape character
declare -a a=("one word" two three split_array four five)
ifs_bak=$IFS    # back up IFS
IFS=$ESC        # new delimiter
b="${a[*]}"
declare -a c=( ${b%%${ESC}split_array*} )
for ((i=0; i<${#c[@]}; i++)); do
    echo "${c[$i]}"     # test output
done
IFS=$ifs_bak    # retrieve IFS

输出:

one word
two
three

可能还不能100%保证数组元素中从未使用过转义字符。将数组合并为字符串时,总是存在风险

希望这会有所帮助。

答案 1 :(得分:1)

如果您正在考虑Perl,请检查此

>  perl -e '@a=qw(one two three split_array four five);for(@a) { last if /split/; print "$_\n" }'
one
two
three
>

如果导出为变量,

> export a="one two three split_array four five"
> perl -e ' @a=split / /, $ENV{a}; for(@a) { last if /split/; print "$_\n" }'
one
two
three
>