如何在 posix 环境中操作 semver 值?
How can I manipulate semver values in a posix environment?
我需要一种相当便携的方法来在 posix 环境中操作 semver 值。
具体来说:
1.排序,and
2. 递增以下之一:给定 semver 值的主要、次要、补丁。
如果你有 bash,我想你可以将 semver 值读入数组:
文件
10.4.3
11.5
124.4.5
12
您可以使用 space 填充重新打印它们
$ 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=
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
我需要一种相当便携的方法来在 posix 环境中操作 semver 值。
具体来说:
1.排序,and
2. 递增以下之一:给定 semver 值的主要、次要、补丁。
如果你有 bash,我想你可以将 semver 值读入数组:
文件
10.4.3
11.5
124.4.5
12
您可以使用 space 填充重新打印它们
$ 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=
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