
たとえば、次のパラメータにはリスト値(マシンリスト)が含まれます。
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.positional
jq
構文が正しい場合(例に不適切な場所にコンマが含まれている場合)、コンピュータのリストを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"
]
}