在 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 .....
我需要用我已有的变量替换“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 .....