如何根据每个元素的子字符串对数组进行排序?
例如给定一个数组
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'}"