Ordenar una matriz según la subcadena de cada elemento

Ordenar una matriz según la subcadena de cada elemento

¿Cómo se ordena una matriz en función de una subcadena de cada elemento?
por ejemplo, dada una matriz como

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

Me gustaría ordenar los elementos por la cadena numérica que precede stuffpara terminar con

3evenmore01stuff
4more02stuff
1no04stuff
2some05stuff

Sé que la expansión de parámetros marca o/ Oreordena una matriz, por ejemplo

imprimir -rl "${(@on)arr}"
1no04stuff
2some05stuff
3evenmore01stuff
4more02stuff

y

imprimir -rl "${(@On)arr}"
4more02stuff
3evenmore01stuff
2some05stuff
1no04stuff

Simplemente no sé si es posible combinarlos con una función u otra expansión de parámetros como, por ejemplo, la eliminación de subíndices o la expansión de subíndices...

Respuesta1

No conozco una manera de hacer esto en línea. Con los calificadores globales, puede especificar una clave de clasificación ( *(oe\''REPLY=${${REPLY%stuff*}##*[^0-9]}'\')), pero no existe tal cosa con los modificadores de expansión de parámetros.

Lo que puede hacer es crear una matriz auxiliar que contenga ${sort_key}$'\0'${value}, es decir, agregar un byte nulo y el valor original a la clave de clasificación. Suponiendo que las claves de clasificación no contienen bytes nulos, ordenar esa matriz proporciona el orden deseado y eliminar el prefijo de la clave de clasificación proporciona el resultado deseado.

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'}"

información relacionada