替换并增加 bash 中的一行

替换并增加 bash 中的一行

如何读取、增加和替换文件中的值?

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.10000if $verwas 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-- 使用下一个参数作为要执行的代码

该代码表示​​对每一行输入进行搜索和替换; “搜索”部分将仅匹配以下行:

  1. 首先ver="
  2. 后跟一位或多位数字(\d+表示“匹配数字,一次或多次”)
  3. 后跟一个句点.,必须根据正则表达式规则对其进行转义
  4. 后跟一个或多个非句点字符
  5. 随后是一个句点.
  6. 后跟一个或多个非句点字符
  7. 后跟双引号

项目 #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

相关内容