0

我有一个看起来像这样的 json:-

{
    "name": "abc",
    "version": "20.02.01",
    "tag": "24",
    "abc_version": "20.02",
    "registry": "registry.abc.com",
    "vendor": "greenplanet",
    "apps": [
      {
        "name": "abc-app",
        "version": "20.02.01-16",
        "volumes": [
          "/dev/log:/dev/log"
        ],
        "max_instances": "1"
      },
      {
        "name": "xyz-app",
        "version": "2.0.0-2",
        "volumes": [
          "/dev/log:/dev/log"
        ],
        "max_instances": "1"
      }      
    ]
}

根据条件,我需要增加 abc-app 或 xyz-app 的版本。目前它的 abc-app 位于“20.02.01-16”,我需要将其更改为“20.02.01-17”。此外,我需要将父应用程序的标签“abc”增加到“25”,我可以使用 sed 增加版本,但这对我不起作用:-

./jq -r ".apps" version.json | ./jq -r ".[] | .version" | grep -v '1.0.2' |sed -r 's/([0-9]+.[0-9]+.[0-9]+)(.*)([0-9]+)/echo "\1\2$((\3+1))"/e'

我需要在 json 中就地增加上述所有条件,或者可能将其添加到可以移动到原始文件的临时文件中。

先感谢您。

4

1 回答 1

1

首先,让我们定义一个辅助函数来执行增量:

# return a string
def inc:
  (capture("(?<pre>.*)-(?<post>[0-9]+$)") | "\(.pre)-\( (.post|tonumber) + 1 )")
  // "\(tonumber+1)" ;

解决方案的其余部分现在可以写成两行,每行代表要递增的每个值:

.tag |= inc
| .apps |= map(if .name == "abc-app" then .version |= inc else . end)

就地编辑

您可以使用sponge, 或临时文件,或 ... (参见例如 "How can "in-place" editing of a JSON file be accomplished?" jq 的常见问题解答)。

于 2020-09-12T23:19:32.623 回答