jsonの要素に値を追加する

jsonの要素に値を追加する

たとえば、次のパラメータにはリスト値(マシンリスト)が含まれます。

echo $list_of_machine

worker01.sys645.com worker02.sys645.com worker03.sys645.com worker04.sys645.com worker05.sys645.com

私たちはこの標準JSONを持っています。

{
  "MNN_server": [
    "master02.sys645.com"
  ],
  "HTTP_SERVER": [
    "master01.sys645.com",
  ]
}

値を追加する方法 - $list_of_machineの下HTTP_サーバー要素は次のとおりです。

期待されるパフォーマンス

{
  "MNN_server": [
    "master02.sys645.com"
  ],
  "HTTP_SERVER": [
    "master01.sys645.com",
    "worker01.sys645.com",
    "worker02.sys645.com",
    "worker03.sys645.com",
    "worker04.sys645.com",
    "worker05.sys645.com"
  ]
}

答え1

]「標準JSON」は実際にはJSONではありません(末尾に追加のコンマがありますHTTP_SERVER)。

また、sedこれはソースが必要な方法でフォーマットされている場合にのみ機能し、任意のJSON(改行がない可能性がある)では機能しません。

したがって、より良い解決策は次jqのように使用することです。

$ jq --arg list "$list_of_machine" '.HTTP_SERVER|=.+($list|split(" "))' < your_file.json 
{
  "MNN_server": [
    "master02.sys645.com"
  ],
  "HTTP_SERVER": [
    "master01.sys645.com",
    "worker01.sys645.com",
    "worker02.sys645.com",
    "worker03.sys645.com",
    "worker04.sys645.com",
    "worker05.sys645.com"
  ]
}

your_file.jsonもちろんよく整理されたものもあります。

答え2

シェルを使用しているので、bashアレイにアクセスできます。配列を使用してマシンのリストを保存します。

machines=(
        worker01.sys645.com
        worker02.sys645.com
        worker03.sys645.com
        worker04.sys645.com
        worker05.sys645.com
)

シェルが配列を使用しない場合は、位置引数リストを使用します。

set --  worker01.sys645.com \
        worker02.sys645.com \
        worker03.sys645.com \
        worker04.sys645.com \
        worker05.sys645.com

プレフィックスを付けると、jqツールは引数リストの末尾にリストを取得し、式で(JSON配列)を使用してそのリストにアクセスできるように--argsします。$ARGS.positionaljq

構文が正しい場合(例に不適切な場所にコンマが含まれている場合)、コンピュータのリストをJSONファイルに追加できます。

jq '.HTTP_SERVER += $ARGS.positional' file.json --args "${machines[@]}"

または、位置引数リスト内のリストを使用します。

jq '.HTTP_SERVER += $ARGS.positional' file.json --args "$@"

文字列リストは--argsコマンドラインの最後の項目でなければなりません。

出力は標準出力ストリームに移動します。

答え3

インデントが少し異なります。

$ sed 's/\("master01.sys645.com",\)/\1'$(echo -e "\\\\n\\\\t\"${list_of_machine// /\",\\\\n\\\\t\"}\"")'/' json
{
  "MNN_server": [
    "master02.sys645.com"
  ],
  "HTTP_SERVER": [
    "master01.sys645.com",
        "worker01.sys645.com",
        "worker02.sys645.com",
        "worker03.sys645.com",
        "worker04.sys645.com",
        "worker05.sys645.com"
  ]
}

関連情報