【发布时间】:2021-01-07 09:43:17
【问题描述】:
我正在尝试将版本号增加 0.10,但也保持跟随零。这是我所拥有的:
printf '%s\n' '1.00' '1.50' '1.90' | perl -i -pe "s/\K.+/$&+0.1/e"
这会返回:
1.1
1.6
2
但我希望它返回:
1.10
1.60
2.00
关于如何实现这一点的任何提示?
【问题讨论】:
我正在尝试将版本号增加 0.10,但也保持跟随零。这是我所拥有的:
printf '%s\n' '1.00' '1.50' '1.90' | perl -i -pe "s/\K.+/$&+0.1/e"
这会返回:
1.1
1.6
2
但我希望它返回:
1.10
1.60
2.00
关于如何实现这一点的任何提示?
【问题讨论】:
当人们发现正则表达式有多强大时,他们通常会开始在任何地方使用它们——即使它们不是最合适的工具。
这里不需要正则表达式。你要的是sprintf()。
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
my @vers = qw(1.00 1.50 1.90);
for (@vers) {
my $newver = sprintf '%.2f', $_ + .1;
say "$_ -> $newver";
}
输出:
1.00 -> 1.10
1.50 -> 1.60
1.90 -> 2.00
【讨论】:
首先,
s/\K.+/$&+0.1/e
是一种非常奇怪的写作方式
$_ += 0.1 if length
它显然可以缩短为
$_ += 0.1
解决方案:
替换-p 和
s/\K.+/$&+0.1/e
-n 和
printf "%.2f", $_ + 0.1
【讨论】:
使用 awk:
$ printf '%s\n' '1.00' '1.50' '1.90' |
awk '{printf "%.2f\n",$0+0.1}'
输出:
1.10
1.60
2.00
【讨论】:
你也可以把它交给 zsh。例如,
export v
for v in 1.00 1.50 1.90
do
zsh -c 'printf %.2f $((v+0.1))'
done
分别,如果您需要在变量中捕获递增的版本,
new_version=$(zsh -c 'printf %.2f $((v+0.1))')
当然,如果你走得这么远,你可以考虑用 zsh 而不是 bash 编写整个脚本。
【讨论】:
普通的 POSIX shell 函数:
#!/usr/bin/env sh
newver() {
version=$1
major=${version%.*}
minor=$((${version#*.} + 10))
if [ $minor -gt 99 ]; then
minor=0
major=$((major + 1))
fi
printf '%d.%02d\n' $((major)) $((minor))
}
for v in '1.00' '1.50' '1.90'; do
newver "$v"
done
输出:
1.10
1.60
2.00
或者使用bc的单线:
for v in 1.00 1.50 1.90;do echo scale=2\;$v+.1|bc;done
【讨论】: