Сортировка массива на основе подстроки каждого элемента

Как сортировать массив на основе подстроки каждого элемента?
например, для такого массива, как

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

Я хотел бы отсортировать элементы по числовой строке, которая предшествует stuff поэтому я получаю

 3evenmore01stuff 4more02stuff 1no04stuff 2some05stuff 

Я знаю, что флаги расширения параметров o / O переупорядочивают массив, например

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

а также

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

Я просто не знаю, возможно ли комбинировать их флаги с функцией или другим расширением параметра, например, например, удаление индекса или расширение подстроки …

Я не знаю, как это сделать. С квалификаторами globs вы можете указать ключ сортировки ( *(oe\''REPLY=${${REPLY%stuff*}##*[^0-9]}'\') ), но нет такой вещи с модификаторы расширения параметров.

Вы можете создать дополнительный массив, содержащий ${sort_key}$'\0'${value} , то есть добавить нулевой байт и исходное значение в ключ сортировки. Предполагая, что ключи сортировки не содержат нулевых байтов, сортировка этого массива дает желаемый порядок, а снятие префикса ключа сортировки дает желаемый результат.

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