在JSON文件中的任何地方找到键值,并将key替换为变量

cnjp1d6j  于 2023-10-21  发布在  其他
关注(0)|答案(1)|浏览(179)

我需要用一个已经有的变量替换“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。

oknwwptz

oknwwptz1#

一种方法是使用walk
假设$host保存所需的值,jq过滤器将是:

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

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

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

您可以使用--arg命令行选项传入值,例如。

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

相关问题