次のjsonファイルがあります。
{ "active": "secure", "secure": { "nodetype": "secure", "nodeid": null, "servers": [ "ts2.na", "ts1.na", "ts3.na" ], "stakeaddr": null, "email": null, "fqdn": null, "ipv": "4" } }
私はこれを次のように変更したいと思います:
"active": "secure",
"secure": {
"nodetype": "secure",
"nodeid": null,
"servers": [
"ts2.na",
"ts1.na",
"ts3.na"
],
"stakeaddr": "my nicea address",
"email": "[email protected]",
"fqdn": "itsmyfqdn",
"ipv": "4"
}
}
だから私はこれを試しました。
jq '.secure.stakeaddr = "私の良いアドレス"' config.json
それは私に次のような結果を与えますが:
{
"stakeaddr": "my nice address",
"email": null,
"fqdn": null,
}
ただし、config.jsonを実行すると、変更されていない最後のファイルが表示されます。私も同じ結果でchmod 777を試しました。何が間違っているのかわかりません。
ベストアンサー1
jq
内部編集はありません。
代わりに:
cp config.json config.json.tmp &&
jq '.secure.stakeaddr = "my nice address"' config.json.tmp >config.json &&
rm config.json.tmp
これにより、ファイルが一時ファイルにコピーされ、修正が適用され(コピーが成功した場合)、結果が元のファイル名にリダイレクトされます。その後、一時ファイルが削除されます(呼び出しがjq
成功した場合)。
config.json
これにより、次の新しいファイルが提供されます。
{
"active": "secure",
"secure": {
"nodetype": "secure",
"nodeid": null,
"servers": [
"ts2.na",
"ts1.na",
"ts3.na"
],
"stakeaddr": "my nice address",
"email": null,
"fqdn": null,
"ipv": "4"
}
}
シェル変数から値を挿入するには:
$ fqdn='Then she said "hello"'
$ jq --arg fqdn "$fqdn" '.secure.fqdn = $fqdn' file.json
{
"active": "secure",
"secure": {
"nodetype": "secure",
"nodeid": null,
"servers": [
"ts2.na",
"ts1.na",
"ts3.na"
],
"stakeaddr": null,
"email": null,
"fqdn": "Then she said \"hello\"",
"ipv": "4"
}
}
つまり、will intoを使用して式内で渡します--arg variable value
。そうすればvalue
jq
$variable
jq
正しくエンコードされた値。シェル変数の値を式に直接挿入すると、その値はエンコードされず、エラーや誤ったJSON文書が発生する可能性があります。