web-dev-qa-db-ja.com

既存のJSON配列に新しい要素を追加する

_"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"
    }
  ]
}
_

_{
  "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"
    }
  ]
}
_
4
tr53

awksedなどの標準のテキスト処理ツールを使用して、またはPerlにJSONモジュールを使用せずにJSONテキストを解析しようとしないでください。 jqは、コンテンツをその場で操作できる軽量のJSONプロセッサです。

たとえばあなたの要件は単に次のように書くことができます

jq --arg new "arn:aws:iam::xxxxxxx:role/3" '.Statement[].Principal.AWS? += [$new]' json

追加する要素が複数ある場合は、JSON BLOBとして引数を作成します

jq --argjson new '["arn:aws:iam::xxxxxxx:role/3", "arn:aws:iam::xxxxxxx:role/4"]' '.Statement[].Principal.AWS? += $new'

ツールのダウンロードと使用の手順は Download jq にあり、使用方法のチュートリアルは jq Manual にあります。

内容がファイル内にあり、このファイルを永続的に変更する場合は、spongeなどのインプレース編集ツールを使用して、GNU moreutilsパッケージから入手できます。

jq --arg new "arn:aws:iam::xxxxxxx:role/3" '.Statement[].Principal.AWS? += [$new]' json | sponge json

またはmktempのようなPOSIXツールを使用します

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