【问题标题】:How to replace multiple values in json file using jq and returning the whole content如何使用 jq 替换 json 文件中的多个值并返回全部内容
【发布时间】:2023-01-29 19:27:32
【问题描述】:

我有一个这样的 json

[{"version": 0.0,"Resources": [ {"TargetService": {"Type": "AWS::ECS::Service","Properties": {"TaskDefinition": "abc","LoadBalancerInfo": {"ContainerName": "def","ContainerPort": 8080}}}} ]}]

我的尝试是更换任务定义从“abc”到“123”的键值和容器名称在一个命令中从“def”到“456”的键值并返回整个更新 json。

这是我试过的

echo $APP_SPEC | jq --arg TASK_DEFINITION "123" '(.[].Resources[].TargetService | select(.Properties)).TaskDefinition |=$TASK_DEFINITION')

但是替换没有正确发生,值被附加在 josn 的末尾,如下所示。

错误回应:

[ { "version": 0, "Resources": [ { "TargetService": { "Type": "AWS::ECS::Service", "Properties": { "TaskDefinition": "abc", "LoadBalancerInfo": { "ContainerName": "container_name", "ContainerPort": 8080 } }, "TaskDefinition": "123" } } ] } ] 

【问题讨论】:

    标签: json linux yaml jq


    【解决方案1】:

    使用更新操作符|=

    .[].Resources[].TargetService.Properties |= (
      .TaskDefinition = "123"
      | .LoadBalancerInfo.ContainerName = "456"
    )
    

    Demo


    请注意,select 仅过滤其输入,而不会下降到过滤条件中。因此,如果您只想在 .Properties 字段存在时进行更新,请使用 select下降到它。

    ( .[].Resources[].TargetService
      | select(.Properties).Properties
    ) |= (
      .TaskDefinition = "123"
      | .LoadBalancerInfo.ContainerName = "456"
    )
    

    Demo

    【讨论】:

      【解决方案2】:

      不需要select,直接指定路径即可:

      .[].Resources[].TargetService.Properties.TaskDefinition |= "123"
      | .[].Resources[].TargetService.Properties.LoadBalancerInfo.ContainerPort |= 456
      

      或者按顶级属性分组:

      .[].Resources[].TargetService.Properties |= (
          .TaskDefinition |= "123",
          .LoadBalancerInfo.ContainerPort |= 456
      )
      

      也可以递归地将预期对象合并到现有对象中:

      .[].Resources[].TargetService.Properties *= {
          TaskDefinition: "123",
          LoadBalancerInfo: {
              ContainerPort: 456
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-17
        • 1970-01-01
        • 2020-12-28
        • 1970-01-01
        • 2016-12-30
        • 1970-01-01
        相关资源
        最近更新 更多