求助:使用sed匹配version行并递增dev后版本号的问题
问题解答
1. 你的sed命令存在的问题
- sed默认使用基础正则表达式(BRE),其中
+是普通字符,不具备“匹配一次或多次”的量词功能,因此[0-9]+无法正常匹配连续数字序列。 - 若要使用
+这类扩展正则表达式(ERE)语法,需要给sed添加-E(部分版本兼容-r)参数启用ERE模式。 - 另外你的替换规则会把整行直接替换成
test,匹配范围过于宽泛,不符合仅修改dev后数字的需求。
2. 实现dev后数字递增的命令行方法
方法一:使用awk(逻辑清晰,推荐)
awk可直接提取数字并完成算术运算,命令如下:
awk '/^version = "/{split($3, arr, /dev/); num = substr(arr[2], 1, length(arr[2])-1); new_num = num + 1; print $1 " " $2 " \"" arr[1] "dev" new_num "\""; next}1' sed-test.txt > temp.txt && mv temp.txt sed-test.txt
逻辑说明:
- 匹配以
version = "开头的目标行 - 用
split将版本字符串按dev拆分,得到前缀arr[1](如1.1.)和带引号的数字段arr[2](如12") - 提取数字段中的纯数字并加1,重新拼接成新的version行
- 其他行保持原样输出,最后通过临时文件覆盖原文件
方法二:使用sed结合shell算术
利用sed捕获组配合shell命令完成递增,命令如下:
sed -E -i.bak 's/^(version = ".*dev)([0-9]+)"/echo "\1$((\2+1))"/e' sed-test.txt
逻辑说明:
-E启用扩展正则表达式,支持捕获组()和+量词- 捕获组
\1匹配version = "xxxdev部分,\2匹配dev后的数字 /e参数让sed将替换后的字符串作为shell命令执行,通过$((\2+1))完成数字递增-i.bak会自动备份原文件为sed-test.txt.bak,不需要备份可直接写-i
验证效果
执行命令后,原文件中的version = "1.1.dev12"会被替换为version = "1.1.dev13"
内容的提问来源于stack exchange,提问作者Matthias
相关产品推荐
相关产品推荐

