각 요소의 하위 문자열을 기반으로 배열을 정렬하는 방법은 무엇입니까?
예를 들어, 배열이 주어지면
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'}"