2015-07-09 3 views
1

Мне нужен довольно переносимый способ манипулирования значениями semver в среде posix.Как я могу манипулировать значениями semver в среде posix?

В частности:
1. Сортировка и
2. приращением одно из следующего: мажор, минор, участок заданного semver значения.

+0

[Этот вопрос] (http://stackoverflow.com/q/4023830/258523) имеет ответы на вопрос о сортировке. Некоторые из задействованных компонентов повторно используются для увеличения. –

ответ

2

Если у вас есть Баш, я полагаю, вы могли читать semver значения в массивы:

Файл

10.4.3 
11.5 
124.4.5 
12 

Вы можете перепечатывать их с пространством заполнения

$ deSemverize(){ while read line; do IFS=. read -a fields<<<"$line"; printf "%4d %4d %4d\n" ${fields[@]}; done ; } 
$ deSemversize < File 
#=> 
    10 4 3 
    11 5 0 
124 4 5 
    12 0 0 

и так ' ' < '0' , вы можете отсортировать результат лексически, и это будет так, как если бы вы отсортировали сначала MAJOR, затем MINOR, а затем PATCH. Вы можете распечатать результаты как значения Semver снова:

$ semverize() { while read line; do read -a fields<<<"$line"; printf "%d.%d.%d\n" ${fields[@]}; done; } 

$ deSemversize < File | sort | semverize 
#=> 10.4.3 
     11.5.0 
     12.0.0 
    124.4.5 

Что касается изменения полей, вы можете сделать стандартные Баш арифметику на числовых переменных с (()) или $(()), например:

echo "$((fields[0]+1))"

I будет использовать выравнивание по правому краю маски:

semverBump() { 
    local mask=$1 
    local dots_in_mask=${mask//[^.]/} 
    case "$dots_in_mask" in 
    "") mask=..$mask;; 
    ".") mask=.$mask;; 
    esac 

    local maskarray 
    IFS=. read -a maskarray<<<"$mask" 

    while read line; 
    do IFS=. read -a fields<<<"$line"; 
    for((i=0;i<3;i++)) 
    do 
     ((fields[$i]+=0)) 
     [[ -z "${maskarray[$i]}" ]] && continue 

     if [[ "${maskarray[$i]}" =~ ^[+-].* ]]; then 
     ((fields[$i]+=maskarray[$i])) 
     else 
     ((fields[$i]=maskarray[$i])) 
     fi 
    done 
    printf "%d.%d.%d\n" ${fields[@]} 
    done ; 
} 

Eg:

semverBump +2 < File #increase all minor by 2 
    semverBump 2 < File #set all minor to two 
    semverBump +1.-1.0 < File #increment major, decrement minor, set patch to zero 
+1

Спасибо. Недавно я понял, что могу использовать 'sort -t '.' -k 1,1 -k 2,2 -k 3,3-g'. Хотя у меня все еще нет хорошего способа увеличить семестр с помощью major/minor/patch. – z5h

+0

Добавлен «хороший способ» для увеличения/уменьшения/установки полей. – PSkocik

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