次の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文書が発生する可能性があります。
答え2
jqに限定されない場合は、簡単なオプションがあります。jtc
内部修正を許可します。
ソースjsonがfileにあると仮定すると、追加は次のconfig.json
よう"stakeaddr": "my nice address"
になります。
bash $ jtc -w'[secure]' -mu'{ "stakeaddr": "my nice address" }' -f config.json
bash $ cat config.json
{
"active": "secure",
"secure": {
"email": null,
"fqdn": null,
"ipv": "4",
"nodeid": null,
"nodetype": "secure",
"servers": [
"ts2.na",
"ts1.na",
"ts3.na"
],
"stakeaddr": "my nice address"
}
}
bash $
同じ目標を達成する方法はいくつかあります。タグがstakeaddr
ソースjsonにすでに存在することを考慮すると、より良いアプローチは次のとおりです。
bash $ jtc -w'[secure][stakeaddr]' -u'"my nice address"' -f config.json
答え3
ほとんどの*nixディストリビューションにpython
すでにプリインストールされていて、データを含むjsonファイルが呼び出されることを考慮して、file.json
次のスクリプトを実行してください。
import json
from pprint import pprint
with open('file.json', 'r') as f:
jsonData = json.load(f)
pprint(jsonData)
次のような結果が印刷されます。
{'active': 'secure',
'secure': {'email': None,
'fqdn': None,
'ipv': '4',
'nodeid': None,
'nodetype': 'secure',
'servers': ['ts2.na', 'ts1.na', 'ts3.na'],
'stakeaddr': None}}