1

我需要一种在 posix 环境中操作 semver 值的相当便携的方法。

具体来说:
1. 排序,以及
2. 递增以下之一:major、minor、patch 给定的 semver 值。

4

1 回答 1

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

至于修改字段,您可以使用(())or对数值变量执行标准 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
于 2015-07-09T22:10:11.983 回答