bash:正则表达式:查找并替换文件中的变量

时间:2018-03-12 13:47:12

标签: regex bash awk

我有一个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的东西很新:)

2 个答案:

答案 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"
  }
}