使用 unix shell 查找并替换括号内的所有内容 - 几行

使用 unix shell 查找并替换括号内的所有内容 - 几行

我需要使用 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使用输出覆盖原始文件。

相关内容