在 JSON 文件中的任意位置查找键值,并将键替换为变量

Find a key-value anywhere in JSON file and replace key with a variable

我需要用我已有的变量替换“JaegerAgentHost”的值。

我在每个应用程序上都有多种 JSON 格式。

APP1 JSON 文件:

{
"Settings": {
"JaegerServiceSettings": {
"JaegerAgentHost": "jaeger.apps.internal",
"JaegerAgentPort": "6831"
} } }

APP2 JSON 文件:

{
"JaegerServiceSettings": {
"JaegerAgentHost": "jaeger.apps.internal",
"JaegerAgentPort": "6831",
} }

App3 JSON 文件:

{
"JaegerAgentHost": "jaeger.apps.internal",
"JaegerAgentPort": "6831"
}

不管 JaegerAgentHost 的键值路径如何,我应该可以用我的变量替换它的值,最终应该如下所示

预期输出::

APP1 JSON 文件:

{
"Settings": {
"JaegerServiceSettings": {
"JaegerAgentHost": "jaeger.app",
"JaegerAgentPort": "6831"
} } }

APP2 JSON 文件:

{
"JaegerServiceSettings": {
"JaegerAgentHost": "jaeger.app",
"JaegerAgentPort": "6831",
}}

App3 JSON 文件:

{
"JaegerAgentHost": "jaeger.app",
"JaegerAgentPort": "6831"
}

当我有多个 JSON 文件时,我想用 jq 和 bash

查找并替换特定的键值,请告知我们该怎么做

到目前为止,我有多个命令替换每个 json 文件,这不是最佳做法。

这让我无法为所有人制作通用脚本。

我可以使用 sed 但担心任何 JSON 文件可能发生的结构变化,因为它们不统一并且更喜欢 jq。

一种方法是使用 walk.

假设 $host 包含所需的值,jq 过滤器将是:

walk(if type == "object" and has("JaegerAgentHost")
     then .JaegerAgentHost = $host else . end)

另一种方法是使用 ..|=:

(..|objects|select(.JaegerAgentHost).JaegerAgentHost) |= $host

您可以使用 --arg command-line 选项传入值,例如

   jq --arg host jaeger.app .....