json - 在 linux 中使用 shell 脚本在 JSON 文件的末尾插入一个 JSON 对象
问题描述
我有一个文件 ~/.docker/config.json 如下。
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "bmFnZGVlcGdrOk5hZzEzNDFkb2NrZXJA"
}
}
}
我想在我的 ubuntu 18.04 中使用 shell 脚本 (*.sh) 将以下 JSON 对象附加到它。我怎样才能做到这一点?
"proxies": {
"default": {
"httpProxy": "http://proxy.xyz.com:123",
"httpsProxy": "http://proxy.xyz.com:123",
"noProxy": "127.0.0.1,localhost"
}
}
所以最终文件 ~/.docker/config.json 应该是这样的:
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "bmFnZGVlcGdrOk5hZzEzNDFkb2NrZXJA"
}
},
"proxies": {
"default": {
"httpProxy": "http://proxy.xyz.com:123",
"httpsProxy": "http://proxy.xyz.com:123",
"noProxy": "127.0.0.1,localhost"
}
}
}
如何使用 shell 脚本实现这个附加 JSON 对象到 JSON 文件的末尾。
解决方案
您可以使用jq
向 中的对象添加新的键值对config.json
,然后将新对象写回磁盘。
jq '.proxies = {
"default": {
"httpProxy": "http://proxy.xyz.com:123",
"httpsProxy": "http://proxy.xyz.com:123",
"noProxy": "127.0.0.1,localhost"
}
}' ~/.docker/config.json > tmp && mv tmp ~/.docker/config.json
里面的一切jq
都是一个过滤器:它们将 JSON 值流作为输入,并返回 JSON 值流作为输出。分配也不例外。
在过滤器x = y
中,x
是一个路径表达式,y
是一个普通的过滤器。x
使用输入进行评估以确定分配的“目标”。y
应用于输入,其输出由 分配给特定的目标x
。
在这种情况下,输入是 的全部内容config.json
。.proxies
指定对象中的键,{...}
表达式是忽略输入并生成 JSON 对象的过滤器。该 JSON 对象是添加到proxies
键下的输入的对象,修改后的对象作为输出返回,jq
然后写入标准输出。
结果被写入一个新文件,这样我们config.json
在读取它之前就不会覆盖它。假设jq
成功,我们可以config.json
用新文件替换旧文件tmp
。
jq
本身不能写入文件,只能写入标准输出。它可以从标准输入或命名为参数的文件中读取 JSON 值。
推荐阅读
- android - 自定义测试编排器或用于开始/结束的回调
- c++ - 如何保护系统与数据库之间的密码
- android - 谷歌地图不适用于 MapFragment
- php - 不要安装 Symfony Flex
- mysql - Linq2db (MySQL)。设置行索引
- mongodb - MongoDB 是否真的声称 ObjectID 在生产中是唯一的?
- docker - Docker Volume - 从容器中删除时保留主机文件
- android - UBER -404- 身份验证 - 无效授权
- android - 如果应用程序未在后台运行,则深层链接操作不起作用
- java - 在 Jenkins TestNG 结果中,失败测试用例链接打开并显示错误消息