根据每个元素的子字符串对数组进行排序

根据每个元素的子字符串对数组进行排序

如何根据每个元素的子字符串对数组进行排序?
例如给定一个数组

arr=( 2some05stuff 4more02stuff 3evenmore01stuff 1no04stuff )

我想按前面的数字字符串对元素进行排序,stuff所以我最终得到

3evenmore01stuff
4more02stuff
1no04stuff
2some05stuff

我知道参数扩展标志o/O重新排序数组,例如

打印-rl“${(@on)arr}”
1no04stuff
2some05stuff
3evenmore01stuff
4more02stuff

打印-rl“${(@On)arr}”
4more02stuff
3evenmore01stuff
2some05stuff
1no04stuff

我只是不知道是否可以将它们的标志与函数或其他参数扩展(例如下标删除或下标扩展)结合起来......

答案1

我不知道有什么方法可以内联执行此操作。使用 glob 限定符,您可以指定排序键 ( *(oe\''REPLY=${${REPLY%stuff*}##*[^0-9]}'\')),但使用参数扩展修饰符则没有这样的事情。

您可以做的是构建一个包含 的辅助数组${sort_key}$'\0'${value},即将空字节和原始值附加到排序键。假设排序键不包含空字节,对该数组进行排序会给出所需的顺序,并且去掉排序键前缀会给出所需的结果。

typeset -a tmp; tmp=(); typeset -i i
for ((i=1; i<=$#arr; i++)); do tmp[$i]=${${arr[$i]%stuff*}##*[^0-9]}$'\0'$arr[$i]; done
print -lr "${(@)${(@o)tmp}#*$'\0'}"

相关内容