各要素の部分文字列に基づいて配列を並べ替える

各要素の部分文字列に基づいて配列を並べ替える

各要素の部分文字列に基づいて配列をソートする方法は?
たとえば、配列が与えられた場合

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}。つまり、ヌルバイトと元の値をソートキーに追加します。ソートキーにnullバイトが含まれていないと仮定すると、この配列をソートすると目的の順序が与えられ、ソートキーのプレフィックスを削除すると望ましい結果が得られます。

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

おすすめ記事