Eu não sei como fazer isso inline. Com os qualificadores globs, você pode especificar uma chave de classificação ( *(oe\''REPLY=${${REPLY%stuff*}##*[^0-9]}'\')
), mas não existe nada com modificadores de expansão de parâmetro.
O que você pode fazer é criar uma matriz auxiliar contendo ${sort_key}$'%code%'${value}
, ou seja, acrescentar um byte nulo e o valor original à chave de classificação. Supondo que as chaves de ordenação não contenham bytes nulos, ordenar essa matriz dá a ordem desejada e retirar o prefixo da chave de ordenação dá o resultado desejado.
typeset -a tmp; tmp=(); typeset -i i
for ((i=1; i<=$#arr; i++)); do tmp[$i]=${${arr[$i]%stuff*}##*[^0-9]}$'typeset -a tmp; tmp=(); typeset -i i
for ((i=1; i<=$#arr; i++)); do tmp[$i]=${${arr[$i]%stuff*}##*[^0-9]}$'%pre%'$arr[$i]; done
print -lr "${(@)${(@o)tmp}#*$'%pre%'}"
'$arr[$i]; done
print -lr "${(@)${(@o)tmp}#*$'%pre%'}"