用JQ和regex替换JSON中的值

时间:2019-03-07 16:29:01

标签: regex jq

我有以下JSON,我想在其中更改“图像”字符串的“标签”。

{
  "taskDefinition": {
    "containerDefinitions": [
      {
        "name": "php",
        "image": "xxxxxx.dkr.ecr.eu-west-1.amazonaws.com/repo/php:latest",
        "cpu": 0,
        "memory": 512,
      },
      {
        "name": "nginx",
        "image": "xxxxxx.dkr.ecr.eu-west-1.amazonaws.com/repo/nginx:latest",
        "cpu": 0,
        "memory": 256,
      }
    ],
    "family": "service-be",
  }
}

它应该变成:

{
  "taskDefinition": {
    "containerDefinitions": [
      {
        "name": "php",
        "image": "xxxxxx.dkr.ecr.eu-west-1.amazonaws.com/repo/php:new",
        "cpu": 0,
        "memory": 512,
      },
      {
        "name": "nginx",
        "image": "xxxxxx.dkr.ecr.eu-west-1.amazonaws.com/repo/nginx:new",
        "cpu": 0,
        "memory": 256,
      }
    ],
    "family": "service-be",
  }
}

“最新”当然可以是任何东西。

到目前为止,我已经找到了以下正则表达式子项来修改字符串。

'.taskDefinition.containerDefinitions[].image | sub("(?<repo>.*:).*";  \(.repo)new")'

但是我想对其进行编辑并保留整个JSON。 到目前为止,我更改值的尝试均未成功。 我可以将图像值更改为固定字符串,但不能更改为替代的原始值。

我尝试了几种方法:

'.taskDefinition.containerDefinitions[].image |= . | sub("(?<repo>.*:).*"; "\(.repo)new")'

似乎我可以简单地使用的版本(在Bitbucket管道中)不具有走行功能,所以我会避免使用它。

1 个答案:

答案 0 :(得分:0)

哦,经过几次尝试才发现它

'.taskDefinition.containerDefinitions[].image |= sub("(?<repo>.*:).*"; "\(.repo)new")'