regex 使用bash递增ini样式文件中的版本号

tct7dpnv  于 2023-03-09  发布在  其他
关注(0)|答案(2)|浏览(123)

我想编写一个bash脚本来递增包含在名为setup.cfg的文件中的所有[metadata]次要版本号。
setup.cfg的内容可以是:

[metadata]
...
version = 1.2.3
...

[<optional-fields>]
...
version=4.5.6
...

我想 * 仅 * 将1.2.3递增到1.3.3。我想确保不递增[<optional-fields>]的版本号,并考虑version=<metadata version number>之间的可变/无间距。
(编辑)
我可以使用以下命令拉取setup.cfg的所有示例
filepath = find | grep "setup.cfg"
但是我确定如何隔离[metadata]的版本示例。为了定位版本示例,我使用了:
[[:space:]]*(?<=\[metadata\])*[[:space:]]*(:?version)[[:space:]]*(:?=)[[:space:]]*
要用新版本号替换旧版本号,我计划使用
x1米11米1x

deyfvvtc

deyfvvtc1#

使用GNU sed

$  sed -E "/[metadata]/,/[/{s/(\<version ?= ?[^.]*\.)([0-9]+)/echo \1\$((\\2+1))/e;}" setup.cfg
[metadata]
...
version = 1.3.3
...

[<optional-fields>]
...
version=4.5.6
...
8tntrjer

8tntrjer2#

我建议不要使用bashsedgrep,因为这些工具的格式有点复杂。一个简单的python3程序可以做到这一点,如下所示:

import configparser

config = configparser.ConfigParser()
config.read('setup.cfg')
version = config['metadata']['version'].split('.')
version[-1] = str(int(version[-1]) + 1)
config['metadata']['version'] = '.'.join(version)
with open('setup.cfg', 'w') as configfile:
  config.write(configfile)

另一个选择是使用crudini工具,这个工具至少在ubuntu仓库上可用:

#!/bin/bash

IFS=. read -ra arr <<< "$(crudini --get setup.cfg metadata version)"
((arr[2] ++)) 
crudini --set setup.cfg metadata version "$(IFS=.; echo "${arr[*]}")"

this answer推荐了crudini工具。

相关问题