我有一个这样的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,
}
但是,当我 cat config.json 时,它会显示最后一个未更改的文件。我也尝试使用 chmod 777,结果相同。我不知道我做错了什么。
jq
不进行就地编辑。反而:
这会将文件复制到临时文件,对其应用修改(如果复制成功)并将结果重定向到原始文件名。然后删除临时文件(如果
jq
调用成功)。这会给你一个
config.json
看起来像的新文件要从 shell 变量中插入一个值:
即,用于
--arg variable value
将value
into传递jq
,然后$variable
在jq
表达式内传递。请注意,这样做会正确编码 value。将 shell 变量的值直接注入表达式不会对其值进行编码,并且可能会导致错误或格式错误的 JSON 文档。如果您不仅限于 jq,这里有一个简单的选择 -
jtc
允许就地修改。假设您的源 json 在文件
config.json
中,例如,添加"stakeaddr": "my nice address"
将如下所示:有很多方法可以实现相同的目标。鉴于标签
stakeaddr
已经存在于源 json 中,那么更好的方法是:考虑到您有
python
,它预装在大多数 *nix 发行版中,并且包含您的数据的 json 文件名为file.json
,然后执行以下脚本将打印类似于以下的结果: