如何读取、增加和替换文件中的值?
foo="val"
ver="1.2.0001"
...
现在我想将“0001”增加到“0002”。
答案1
假设补丁级别始终是一串四位数字:
$ ver=1.2.0001
$ printf '%s\n' "$ver" | awk -F '.' '{ printf("%s.%s.%04d\n", $1, $2, $3 + 1) }'
1.2.0002
这使用awk
版本并将其视为由点分隔的三个字段。它按原样打印前两个字段,但将 1 添加到第三个字段,并使用%04d
(零填充的四位十进制数)格式化结果。
这将生成1.2.10000
if $ver
was 1.2.9999
。
要将值存储回ver
,请使用ver=$( printf ... | awk ... )
.
答案2
您可以使用perl
,这是一个非常强大的文本操纵器:
perl -pi -e 's/(^ver="\d+)\.(\d+)\.(\d+)"/"$1.$2." . sprintf("%04d", $3+1) . "\""/e' input
这将使用三个选项调用 perl:
-p
-- 自动打印每行输入-i
-- 就地编辑文件-e
-- 使用下一个参数作为要执行的代码
该代码表示对每一行输入进行搜索和替换; “搜索”部分将仅匹配以下行:
- 首先
ver="
- 后跟一位或多位数字(
\d+
表示“匹配数字,一次或多次”) - 后跟一个句点
.
,必须根据正则表达式规则对其进行转义 - 后跟一个或多个非句点字符
- 随后是一个句点
.
- 后跟一个或多个非句点字符
- 后跟双引号
项目 #1 和 #2 在括号中组合在一起作为替换文本$1
;项目#4 是替换文本$2
,项目#6 成为替换文本$3。不过,在放回原位之前$3
,我们通过格式化的打印语句发送它,该语句将值加一。
因为我们需要在替换中执行 perl 代码,所以我们e
需要s///
.我们还必须添加回尾部双引号,这是第 7 项所必需的。
您可以通过多种方式收紧或放松这个正则表达式;也许您可能要求匹配的“ver”字符串是该行中唯一的内容,在这种情况下,您可以$
在第 #7 项中的双引号后面添加行尾锚点。
答案3
和bash
:
$ ver="1.2.0001"
$ printf -v ver '%s.%04d' "${ver%.*}" "$((${ver##*.} + 1))"
$ echo "$ver"
1.2.0002
${ver%.*}
用于获取前缀1.2
去除后缀模式.*
${ver##*.}
用于获取0001
删除最长前缀模式的数字部分*.
printf -v ver ...
使用 bash 算术打印前缀加号.
和递增的数字$((... + 1))
,并将输出保存回变量中ver
。