쉘 스크립트로 다음 목록을 정렬하고 최신 버전을 맨 아래 또는 맨 위에 표시해야합니다. 쉘 도구로만 그렇게 할 수 있습니까?
release-5.0.0.rc1
release-5.0.0.rc2
release-5.0.0
release-5.0.1
release-5.0.10
release-5.0.11
release-5.0.13
release-5.0.14
release-5.0.15
release-5.0.16
release-5.0.17
release-5.0.18
release-5.0.19
release-5.0.2
release-5.0.20
release-5.0.21
release-5.0.22
release-5.0.23
release-5.0.24
release-5.0.25
release-5.0.26
release-5.0.27
release-5.0.28
release-5.0.29
release-5.0.3
답변
GNU 정렬은 -V
대부분 다음과 같은 목록을 처리 할 수 있습니다 ( details ).
-V, --version-sort
natural sort of (version) numbers within text
$ cat vers
release-5.0.19
release-5.0.19~pre1
release-5.0.19-bigbugfix
release-5.0.2
release-5.0.20
$ sort -V vers
release-5.0.2
release-5.0.19~pre1
release-5.0.19
release-5.0.19-bigbugfix
release-5.0.20
그러나 이러한 .rc*
버전은 문제가 될 수 있습니다. 두 버전이 모두있는 경우 해당하는 비 rc 버전 보다 먼저 정렬 해야하기 때문입니다. 데비안과 같은 일부 버전 관리 시스템에서는 물결표 ( ~
)로 시작하는 접미사를 사용 하여 시험판을 표시하고 접미사없이 버전보다 먼저 정렬합니다.이 접미사는 다른 접미사가있는 버전보다 먼저 정렬됩니다. 분명히 이것은 sort
위 ( sort (GNU coreutils) 8.23
) 와 같이 적어도 내 시스템 에서 지원됩니다 .
답변
체크 아웃 sort -V
:
-V, --version-sort
natural sort of (version) numbers within text
버전 번호는 알파벳 부분을 제어하는 표준이 거의없는 복잡한 짐승이지만 실제 데이터에서 시도하여 충분한 지 확인하십시오.
답변
이것은 한 줄로 수행 할 수 있지만 여기서는 가독성을 위해 여러 줄로 (파이프에서) 여러 줄로 나눠서를 처리합니다 rc
.
당신이 -V
당신의 종류에 대한 옵션이 없거나, 당신이 경우에, 때때로 rc
의 를 처리해야합니다 :
cat versionlist |
sed -e "s/release-//" -e "s/rc//" |
sort -t. -n -k1,1 -k2,2 -k3,3 -k4,4 |
sed -r -e "s/([^.]+)\.([^.]+)\.([^.]+)\.([^.]+)/\1.\2.\3.rc\4/" -e "s/^/release-/"
첫 번째 sed
스트립 숫자가 아닌 문자를 사용하는 구분 기호 ( ), 숫자 정렬 (- )와 키 ( )
마지막 숫자가 아닌 문자가 제자리에 다시 넣습니다.sort
.
-t.
n
-k
sed
답변
모든 영감을 가져 주셔서 감사합니다-나 자신의 대답을 제안 할 수 있습니다 : 정렬 프로그램은 필요한 일을하도록 속일 수 있습니다. 결국 세 번째 숫자 버전에 네 번째 숫자를 추가하고 정렬 한 다음 다시 제거해야합니다. 작동-지금까지 가장 간단한 솔루션, IMHO.
cat versionlist |\
sed -r "s/([0-9]+\.[0-9]+\.[0-9]+$)/\1\.99999/"|sort -V|sed s/\.99999$//
결과:
release-5.0.0.rc1
release-5.0.0.rc2
release-5.0.0
....
답변
$ cat /tmp/tmp.tmp
release-5.0.0.rc1
release-5.0.0.rc2
release-5.0.0
release-5.0.1
release-5.0.10
release-5.0.11
release-5.0.13
release-5.0.14
release-5.0.15
release-5.0.16
release-5.0.17
release-5.0.18
release-5.0.19
release-5.0.2
release-5.0.20
release-5.0.21
release-5.0.22
release-5.0.23
release-5.0.24
release-5.0.25
release-5.0.26
release-5.0.27
release-5.0.28
release-5.0.29
release-5.0.3
$ cat /tmp/tmp.tmp | awk -F\- '{ print $2,$1 }' | sort -n | awk '{ print $2 "-" $1 }'
release-5.0.0
release-5.0.0.rc1
release-5.0.0.rc2
release-5.0.1
release-5.0.10
release-5.0.11
release-5.0.13
release-5.0.14
release-5.0.15
release-5.0.16
release-5.0.17
release-5.0.18
release-5.0.19
release-5.0.2
release-5.0.20
release-5.0.21
release-5.0.22
release-5.0.23
release-5.0.24
release-5.0.25
release-5.0.26
release-5.0.27
release-5.0.28
release-5.0.29
release-5.0.3
$