
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, stuff
sodass ich am Ende Folgendes erhalte:
3evenmore01stuff
4more02stuff
1no04stuff
2some05stuff
Ich weiß, dass Parametererweiterungsflags o
/ O
ein 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'}"