根據每個元素的子字串對數組進行排序

根據每個元素的子字串對數組進行排序

如何根據每個元素的子字串對陣列進行排序?
例如給定一個數組

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

相關內容