Если у вас есть Баш, я полагаю, вы могли читать 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
[Этот вопрос] (http://stackoverflow.com/q/4023830/258523) имеет ответы на вопрос о сортировке. Некоторые из задействованных компонентов повторно используются для увеличения. –