
jqを使用して配列に値を追加し、残りを保持しようとしています。
"access":{
"allowed_users":[
"admin",
"test",
],
私が追加したい内容は上記の内容です。これを使用すると、jq '.access.allowed_users + [ "test2" ]'
そこに新しいエントリが追加されますが、ファイルの残りの部分が失われるため、設定ファイルを再作成することはできません。
答え1
追加しようとしていると仮定到着示されたJSONとJSONドキュメントの形式がうまく構成されています。
$ cat file.json
{
"access": {
"allowed_users": [
"admin",
"test"
]
}
}
あなたはできます
$ jq '.access.allowed_users += ["test32"]' file.json
{
"access": {
"allowed_users": [
"admin",
"test",
"test32"
]
}
}
+=
配列に追加するには、配列に新しい要素を割り当てる方法を使用します。
シェル変数に新しい値を使用します。
$ data='My "awesome" data'
$ jq --arg value "$data" '.access.allowed_users += [$value]' file.json
{
"access": {
"allowed_users": [
"admin",
"test",
"My \"awesome\" data"
]
}
}
一度に複数の項目を追加するには、次のコマンドを使用して項目を追加するのが最も簡単な方法です--args
。
$ jq '.access.allowed_users += $ARGS.positional' file.json --args Bilbo Frodo Sam Merry Pippin
{
"access": {
"allowed_users": [
"admin",
"test",
"Bilbo",
"Frodo",
"Sam",
"Merry",
"Pippin"
]
}
}
--args
このオプションの後続の引数は、コマンドラインの最後の引数でなければなりません。
ファイルを変更するには、一時ファイルを使用してください。
jq ...one-of-the-above-approaches... >tmp.json &&
mv tmp.json file.json
これにより、何らかの理由で元のファイルが失敗した場合に&&
元のファイルが上書きされるのを防ぎます。jq