我需要一种在posix环境中操作semver值的相当便携的方式。
具体地:
1.排序,和
2.递增一个给定的semver值的主要,次要,补丁。
答案 0 :(得分: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