Sortieren eines Arrays basierend auf der Teilzeichenfolge jedes Elements

Sortieren eines Arrays basierend auf der Teilzeichenfolge jedes Elements

Wie sortiert man ein Array basierend auf einer Teilzeichenfolge jedes Elements?
Beispielsweise bei einem Array wie

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

Ich möchte die Elemente nach der vorangehenden numerischen Zeichenfolge sortieren, stuffsodass ich am Ende Folgendes erhalte:

3evenmore01stuff
4more02stuff
1no04stuff
2some05stuff

Ich weiß, dass Parametererweiterungsflags o/ Oein Array neu anordnen, z. B.

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

Und

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

Ich weiß nur nicht, ob es möglich ist, diese Flags mit einer Funktion oder anderen Parametererweiterungen zu kombinieren, wie z. B. der Entfernung oder Erweiterung von Indexen ...

Antwort1

Ich kenne keine Möglichkeit, dies inline zu tun. Mit Glob-Qualifizierern können Sie einen Sortierschlüssel ( *(oe\''REPLY=${${REPLY%stuff*}##*[^0-9]}'\')) angeben, aber mit Parametererweiterungsmodifikatoren gibt es so etwas nicht.

Was Sie tun können, ist, ein Hilfsarray zu erstellen ${sort_key}$'\0'${value}, das enthält, d. h. ein Nullbyte und den Originalwert an den Sortierschlüssel anzuhängen. Vorausgesetzt, dass die Sortierschlüssel keine Nullbytes enthalten, ergibt das Sortieren dieses Arrays die gewünschte Reihenfolge, und das Entfernen des Sortierschlüsselpräfixes führt zum gewünschten Ergebnis.

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

verwandte Informationen