2015-07-09 21 views
1

我需要在posix環境中操作semver值的相當便攜的方式。如何操作posix環境中的semver值?

具體地說:
1.分揀,並
2.遞增之一:semver值一個給定的主,次,補丁。

+0

[此問題](http://stackoverflow.com/q/4023830/258523)有關於排序的答案。所涉及的一些組件也可以重複用於遞增。 –

回答

2

如果你有bash的,我想你可以閱讀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 

至於修改字段,可以在數值變量做標準的bash算術與(())$(()),如:

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

我將使用一個右對齊的面膜:

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 ; 
} 

例如:

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'。雖然我還沒有一個很好的方法來通過主要/次要/補丁來增加一個semver。 – z5h

+0

增加/減少/設置字段的「一個不錯的方法」。 – PSkocik