我需要使用 shell 查找并替换 json 文件的很大一部分。例如我有这个文件:
{
"Balise1": true,
"Balise2": true,
"OtherThingEnabled": false,
"proxySettings": {
"port": 0
},
"mailSettings": {},
"maxRunningActivitiesPerJob": 5,
"maxRunningActivities": 5,
}
我需要清除括号内的内容“代理设置”并将其替换为:
"proxySettings": {
"host": "my-proxy.host.com",
"port": 80
}
我无法确定文件开头有多少行。可以是一个、多个或没有。我唯一确定的是括号。我需要它正确缩进。
我已经使用 redex 查看了 sed 函数,但我遇到了行数未知的问题。
你能帮忙吗 ?谢谢
答案1
使用 JSON 处理器jq
(并假设输入是有效的 JSON,但发布的文档不是有效的 JSON,因为它包含尾随逗号):
jq '.proxySettings = { host: "my-proxy.host.com", port: 80 }' file.json
这会将proxySettings
部分设置为给定值,覆盖该键之前关联的任何其他值(如果有)。
如果您想在命令行上传递两个值(可能来自 shell 变量),请使用
myproxy=my-proxy.host.com
myport=80
jq --arg host "$myproxy" --argjson port "$myport" '.proxySettings = { host: $host, port: $port }' file.json
或更短的
myproxy=my-proxy.host.com
myport=80
jq --arg host "$myproxy" --argjson port "$myport" '.proxySettings = $ARGS.named' file.json
最后一个变体创建一个内部jq
对象$ARGS.named
,其中包含两个键 和,host
以及port
命令行上给定的值。该对象被分配给proxySettings
输入文档中的部分。
--arg
我们使用主机名和端口号的原因--argjson
是主机名是需要 JSON 编码的字符串,但端口号是不应编码为 JSON 字符串的数值。
在所有情况下,结果都会写入标准输出。将其重定向到新文件名,或将其通过管道传输以sponge file.json
使用输出覆盖原始文件。