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