首页 > 解决方案 > 在 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 文件的末尾。

标签: jsonjq

解决方案


您可以使用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 值。


推荐阅读