向现有 JSON 数组添加新元素

tr5*_*r53 4 perl sed bash-scripting

如何"arn:aws:iam::xxxxxxx:role/3"在下面添加一行,"arn:aws:iam::xxxxxxx:role/2""arn:aws:iam::xxxxxxx:role/2",之后添加一个逗号。

前:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::xxxxxxx:role/1",
          "arn:aws:iam::xxxxxxx:role/2"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::xxxxxxx:role/1",
          "arn:aws:iam::xxxxxxx:role/2",
          "arn:aws:iam::xxxxxxx:role/3"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

Ini*_*ian 8

不要尝试使用标准文本处理工具(如 )解析 JSON 文本awksed或者不使用 中的 JSON 模块perl,因为它们不支持 JSON 语法。jq是一个轻量级的 JSON 处理器,允许您即时操作内容。

例如,您的要求可以简单地写为

jq --arg new "arn:aws:iam::xxxxxxx:role/3" '.Statement[].Principal.AWS? += [$new]' json
Run Code Online (Sandbox Code Playgroud)

如果要追加的元素不止一个,则将 arg 创建为 JSON blob

jq --argjson new '["arn:aws:iam::xxxxxxx:role/3", "arn:aws:iam::xxxxxxx:role/4"]' '.Statement[].Principal.AWS? += $new'
Run Code Online (Sandbox Code Playgroud)

下载和使用该工具的说明位于jq 手册中的下载 jq和使用教程

如果内容在文件中并且您想永久修改此文件,请使用就地编辑工具,例如sponge可以从 GNU moreutils 包中获得的工具,您可以这样做

jq --arg new "arn:aws:iam::xxxxxxx:role/3" '.Statement[].Principal.AWS? += [$new]' json | sponge json
Run Code Online (Sandbox Code Playgroud)

或使用 POSIX 工具,如 mktemp

temp="$(mktemp)"
jq --arg new "arn:aws:iam::xxxxxxx:role/3" '.Statement[].Principal.AWS? += [$new]' json > "$temp" && mv "$temp" json
Run Code Online (Sandbox Code Playgroud)