JSONファイルで文字列一致後に新しい行を追加する

JSONファイルで文字列一致後に新しい行を追加する

次の作業に助けが必要です。

JSONファイルには、次のようなセクションがあります。

"Principal": {
                "AWS": [
                    "arn:aws:iam::12345677890:root",
                    "arn:aws:iam::12345677891:root",

"AWS": [文字列を探す必要があり、"arn:aws:iam::33333333333:root"という新しい行を追加する必要があります。更新されたjsonコンテンツは次のようになります。

"Principal": {
                "AWS": [
                    "arn:aws:iam::33333333333:root",
                    "arn:aws:iam::12345677890:root",
                    "arn:aws:iam::12345677891:root",

sedを使用してこれを行うにはどうすればよいですか?

答え1

PrincipalあなたがJSONドキュメントの最上位オブジェクトであり、シェル変数に格納されているいくつかの文字列をentryその下(最初に)配列に追加したいとしますAWS

entry='arn:aws:iam::33333333333:root'

jq --arg e "$entry" '.Principal.AWS |= [$e,.[]]' file.json

この式は、jqコマンドラインで代入を使用して、変数に含まれる文字列を配列の先頭に追加します(追加された要素から始まり、元の配列の要素が続く新しい配列で配列を更新/再作成します)。jq$e--argAWS|=$e

要素の追加終わり配列の変更は少し簡単になり、おそらくより効率的です(完全な配列を書き換える必要はありません)。

jq --arg e "$entry" '.Principal.AWS += [$e]' file.json

テスト:

$ cat file.json
{
  "Principal": {
    "AWS": [
      "arn:aws:iam::12345677890:root",
      "arn:aws:iam::12345677891:root"
    ]
  }
}
$ entry='arn:aws:iam::33333333333:root'
$ jq --arg e "$entry" '.Principal.AWS |= [$e,.[]]' file.json
{
  "Principal": {
    "AWS": [
      "arn:aws:iam::33333333333:root",
      "arn:aws:iam::12345677890:root",
      "arn:aws:iam::12345677891:root"
    ]
  }
}
$ jq --arg e "$entry" '.Principal.AWS += [$e]' file.json
{
  "Principal": {
    "AWS": [
      "arn:aws:iam::12345677890:root",
      "arn:aws:iam::12345677891:root",
      "arn:aws:iam::33333333333:root"
    ]
  }
}

答え2

sedここではツールが間違っています。JSONは一般言語ではありませんしたがって、正規表現を適用できるツールは有効なJSONをすべて解析できません。

したがって、JSONを解析して修正するために特別に設計されたツールを使用することをお勧めしjqます。しかし、通常、時々ユーザーにとっては、文字通り7行のPythonを書くほうがきれいです。

#!/usr/bin/env python3
# You'll want to save this to a file, e.g. mypythonscript,
# and make it executable: chmod 755 mypythonscript
import json, sys
data_in = None
with open(sys.argv[1]) as infile:
  data_in = json.load(infile)
data_in["AWS"] = ["arn:aws:iam::33333333333:root"] + data_in["AWS"]
with open(sys.argv[1], "w") as outfile:
  json.dump(data_in, outfile)

あなたを正当にする

./mypythonscript data.json

関連情報