JSON JQ 查找并替换值

9

我正在尝试更新 JSON 结构中的 "image_id" 值。使用以下命令,如何将 ami-d8cf5cab 更改为 ami-a4df7gah。到目前为止,我已经尝试了下面的方法:

cat cog.test.tfstate | jq -r '.modules[].resources[] | select(.type == "aws_launch_configuration") | select(.primary.attributes.name_prefix == "pmsadmin-lc-")'

JSON 数据是:
{
  "type": "aws_launch_configuration",
  "primary": {
    "id": "pmsadmin-lc-v47thk6rcrdgza6dujfzjatmju",
    "attributes": {
      "associate_public_ip_address": "false",
      "ebs_block_device.#": "0",
      "ebs_optimized": "false",
      "enable_monitoring": "true",
      "ephemeral_block_device.#": "0",
      "iam_instance_profile": "cog-test-pmsadmin",
      "id": "pmsadmin-lc-v47thk6rcrdgza6dujfzjatmju",
      "image_id": "ami-d8cf5cab",
      "instance_type": "t2.small",
      "key_name": "cog-test-internal",
      "name": "pmsadmin-lc-v47thk6rcrdgza6dujfzjatmju",
      "name_prefix": "pmsadmin-lc-",
      "root_block_device.#": "0",
      "security_groups.#": "4",
      "security_groups.1893851868": "sg-7ee7bf1a",
      "security_groups.2774384192": "sg-e2e7bf86",
      "security_groups.2825850029": "sg-86e6bee2",
      "security_groups.3095009517": "sg-f4e7bf90",
      "spot_price": "",
      "user_data": "ed03ac6642af8c97562b065c0b37f211b58ad0a2"
    }
  }
}

在这里还可以找到大量的jq替代方案:https://dev59.com/7XI-5IYBdhLWcg3w6c-1#49011455 - Sire
1个回答

20
使用|=运算符为属性赋值:
jq -r '.modules[].resources[] | select(.type == "aws_launch_configuration") | select(.primary.attributes.name_prefix == "pmsadmin-lc-")| .primary.attributes.image_id |= "ami-a4df7gah"

1
有没有一种方法可以直接在JSON文件中进行编辑,即直接更新值? - Ebrahim Moshaya
我不知道。 - hek2mgl
3
如果你还没有注意到,在 jq FAQ 的“常见问题”部分中,第一个问题现在是关于 “原地” 编辑的。 - peak
1
你可以使用 ">" 重定向输出。 - DDS
2
与之类似的命令: cat cog.test.tfstate | jq '.modules[].foo=0' > bar.json - DDS
当在同一文件上使用重定向时,会导致一个空文件。您可以使用sponge命令来避免这种情况(https://linux.die.net/man/1/sponge)。 - steviethecat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接