
如何根據每個元素的子字串對陣列進行排序?
例如給定一個數組
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'}"