2016-11-02 9 views
1

Я хотел бы сортировать семантические варианты (semver.org)Как сортировать семантические версии в bash?

v1.4.0 
v1.4.0-alpha 
v1.4.0-alpha1 
v1.4.0-patch 
v1.4.0-patch9 
v1.4.0-patch10 
v1.4.0-patch2 
v1.5.0 
v1.5.0-alpha 
v1.5.0-alpha1 
v1.5.0-alpha2 
v1.5.0-patch 
v1.5.0-patch1 

в надлежащем порядке. Например, как version_compare() does in PHP (он не напрямую, а может быть использован для этого).

Конечно, sort -V|--version-sort здесь не работает.

$ echo 1.0 1.0-alpha | tr ' ' "\n" | sort --version-sort 
1.0 
1.0-alpha 

Есть ли какой-нибудь подход?

P.S.

В общем смысле, он должен следовать этой схеме:

1.0.0-alpha 
    < 1.0.0-alpha.1 
    < 1.0.0-alpha.beta 
     < 1.0.0-beta 
     < 1.0.0-beta.2 
      < 1.0.0-beta.11 
      < 1.0.0-rc.1 < 1.0.0 
      < 1.0.0-patch < 1.0.0-patch.1. 

P.P.S.

Semver 2.0 не поддерживает исправления, но это необходимо.

ответ

0

Ну, мы могли бы обмануть sort -V, добавив фиктивный символ в конце строки для строк, которые не содержат дефис:

$ echo "$versions" | sed '/-/!{s/$/_/}' | sort -V | sed 's/_$//' 
v1.4.0-alpha 
v1.4.0-alpha1 
v1.4.0-patch 
v1.4.0-patch2 
v1.4.0-patch9 
v1.4.0-patch10 
v1.4.0 
v1.5.0-alpha 
v1.5.0-alpha1 
v1.5.0-alpha2 
v1.5.0-patch 
v1.5.0-patch1 
v1.5.0 

Подчеркивания лексически сортирует после дефиса. Это трюк.

+1

Если у меня нет версий исправлений не в том месте ... –

+0

True. :) Итак, почему вы добавили это? :) – Kirby

+0

Ум, потому что вы не показали нам свой ожидаемый результат? –

1

1. Пользовательский скрипт Баш

Я реализовал my own solution

код немного некрасиво, но это работает.

Установка

$ curl -Ls https://gist.github.com/andkirby/0046df5cad44f86b670a102b7c8b7ba7/raw/version_sort_install.sh | bash 
Semantic version sort: /usr/bin/semversort 

$ semversort 1.0 1.0-rc 1.0-patch 1.0-alpha 
1.0-alpha 
1.0-rc 
1.0 
1.0-patch 

2. Использование semver in node

Примечание: Все версии должны следовать конкретной схеме и не поддерживает "заплату".

https://github.com/npm/node-semver/blob/master/README.md

$ npm install --global semver 
C:\Users\u.user\.node\semver -> C:\Users\u.user\.node\node_modules\semver\bin\semver 
[email protected] C:\Users\a.roslik\.node\node_modules\semver 

$ ~/.node/semver 1.2.3 1.3.6-patch 1.3.6-beta 1.3.6 1.3.6-alpha 1.0.4 
1.0.4 
1.2.3 
1.3.6-alpha 
1.3.6-beta 
1.3.6-patch 
1.3.6 

3. Использование PHP и version_compare() в консоли

Кроме того, в PHP родной version_compare() (с помощью PHP, конечно :)) here.

 Смежные вопросы

  • Нет связанных вопросов^_^