Linux:查找并增加版本

Linux:查找并增加版本,linux,bash,shell,awk,sed,Linux,Bash,Shell,Awk,Sed,如何从文件中获取版本号并将版本增加为1? 我想将版本存储到一个变量中,增加一个,然后将新版本保存到文件中 假设我有一个简单的配置文件application.config,如下所示: [section1] Some = variables [Version] version = 1.0 版本总是以version=开头,没有引号,我添加了引号来演示在=。 我想: 将1.0更改为1.1 1.9应获得1.10,1.99应获得1.100等。 将1.1存储到变量,以便在脚本的另一部分中使用它。 我用se

如何从文件中获取版本号并将版本增加为1? 我想将版本存储到一个变量中,增加一个,然后将新版本保存到文件中

假设我有一个简单的配置文件application.config,如下所示:

[section1]
Some = variables

[Version]
version = 1.0
版本总是以version=开头,没有引号,我添加了引号来演示在=。 我想:

将1.0更改为1.1 1.9应获得1.10,1.99应获得1.100等。 将1.1存储到变量,以便在脚本的另一部分中使用它。 我用sed试过:

sed -i -r 's/version = [0-9]+.[0-9]+/version = $Version/I' application.config
如果我手动输入$version,这会起作用,我如何从文件本身获取它

version=$(sed -nE 's/version = ([0-9]+.[0-9]+)/\1/Ip' application.config)
lastnumber=$((${version##*.}+1))
newversion=${version%.*}.$lastnumber
sed -i -E "s/version = [0-9]+.[0-9]+/version = $newversion/I" application.config
请注意,我已将sed中的-r更改为-E。它们是等效的,但其他sed实现可以理解后者

请注意,我已将sed中的-r更改为-E。它们是等效的,但其他sed实现可以理解后者。

这可能会帮助您:

grep "version = [0-9]*.[0-9]*" <filename> | awk -F '.' '{print $1 "." 1+$2}'
grep -E "version = [0-9]+.[0-9]+" <filename> | awk -F '.' '{print $1 "." 1+$2}'
首先搜索单词版本,然后根据点分隔符将行拆分为两部分,并在第二部分中添加1

备注:需要-E才能使加号起作用。

这可能会帮助您:

grep "version = [0-9]*.[0-9]*" <filename> | awk -F '.' '{print $1 "." 1+$2}'
grep -E "version = [0-9]+.[0-9]+" <filename> | awk -F '.' '{print $1 "." 1+$2}'
首先搜索单词版本,然后根据点分隔符将行拆分为两部分,并在第二部分中添加1


备注:需要-E才能使加号起作用。

只是为了显示另一种您应该避免的方式,因为它难以辨认且难以管理。 因为您知道前缀,所以可以使用grep的perl regexp引擎来提取前缀 整个版本,然后用逗号替换点,bash将在逗号后添加数字,而不在进一步的变量中提取它

sed -E -i "s/\.[[:digit:]]+/\.$(($(grep -Po "(?<=version\s=\s)\d+\.\d+$" conf.ini | sed "s/\./,/g")+1))/g" conf.ini

只是为了展示另一种你应该避免的方式,因为它是难以辨认和管理的。 因为您知道前缀,所以可以使用grep的perl regexp引擎来提取前缀 整个版本,然后用逗号替换点,bash将在逗号后添加数字,而不在进一步的变量中提取它

sed -E -i "s/\.[[:digit:]]+/\.$(($(grep -Po "(?<=version\s=\s)\d+\.\d+$" conf.ini | sed "s/\./,/g")+1))/g" conf.ini

这回答了你的问题吗?这回答了你的问题吗?我在寻找时遇到了那个问题。但在我的情况下,这个例子不起作用。如果我使用sed-r的s/*\version=[0-9]+.*/echo\1\2$\3+1\4/ge'application.config,它将保持为1.0。使用s/../../…/e是一个非常糟糕的主意-与awk的shell调用支持相同的一系列安全问题。这是否回答了您的问题?这回答了你的问题吗?我在寻找时遇到了那个问题。但在我的情况下,这个例子不起作用。如果我使用sed-r的s/*\version=[0-9]+.*/echo\1\2$\3+1\4/ge'application.config,它将保持1.0。使用s/../../…/e是一个非常糟糕的主意-与awk的shell调用支持一样存在一系列安全问题。`awk-F./^version=[0-9]\[0-9]/{print$1fs$2+1}config.txt``awk-F./^version=[0-9]/{print$1fs$2+1}config.txt`