我有一个bash脚本应该在文件中找到正则表达式匹配,并替换它的内容。
所以我在文件中有这个(它是package.json中的版本字符串):
// ...
"version": "1.2.13",
"repository": {
"type": "git"
},
// ...
现在我想匹配数字(13),增加它并用当前的数字替换它。
到目前为止我所拥有的是awk
的解决方案,它无法正常工作。
awk -v lvar="$VAR" '/version":\s"[0-9]+.[0-9]+.([0-9]+)/{print $0}' ${PACKAGE_JSON_PATH}
echo ${lvar}
模式是这样的,它给了我最后一个数字。但是,awk语句不起作用。
输出如下:
"version": "1.2.13",
它是做什么的:它打印整行。但是,我只想要其中的13个。并且,它不会将其保存到lvar
变量中。
对不起,我对这个bash的东西很新:)
答案 0 :(得分:1)
使用GNU awk替换13(或任何带有下一个数字的数字),因为你的脚本中有\s
,我看到你已经在使用它了,因为第3个arg匹配() :
$ awk 'match($0,/(^\s*"version":.*\.)([0-9]+)(.*)/,a) {$0 = a[1] a[2]+1 a[3]} 1' file
// ...
"version": "1.2.14",
"repository": {
"type": "git"
},
// ...
如果您愿意,您可以打印原始值:
$ awk 'match($0,/(^\s*"version":.*\.)([0-9]+)(.*)/,a) {print a[2]}' file
13
但我怀疑你是在尝试这样做,因为你正在以错误的方式思考你的真正问题,并试图用shell脚本而不是awk脚本来解决它。
答案 1 :(得分:0)
您最好使用jq
而不是awk
来解析JSON文件。
假设你的档案是:
$ cat file
{ "version": "1.2.13",
"repository": {
"type": "git"
}
}
以下命令通过递增版本字符串的最后一个数字来替换version
值。这将适用于字符串中的3个或更多数字。
<file jq '.version=([(.version | split(".")[0:-1][]),(.version | split(".")[-1]|tonumber +1|tostring)]|join("."))'
{
"version": "1.4.5.14",
"repository": {
"type": "git"
}
}