使用jq,如何替换特定键的值?

使用jq,如何替换特定键的值?

如何替换xxxyyy

{
    "spec": {
        "template": {
            "spec": {
                "containers": [{
                    "args": [
                        "proxy",
                        "router",
                        "--domain",
                        "$(POD_NAMESPACE).svc.cluster.local",
                        "--proxyLogLevel=warning",
                        "--proxyComponentLogLevel=misc:error",
                        "--log_output_level=default:info",
                        "--serviceCluster",
                        "istio-ingressgateway"
                    ],
                    "env": [{
                            "name": "JWT_POLICY",
                            "value": "third-party-jwt"
                        },
                        {
                            "name": "ISTIO_META_OWNER",
                            "value": "kubernetes://apis/apps/v1/namespaces/istio-system/deployments/xxx"
                        }
                    ]
                }]
            }
        }
    }
}

答案1

以下是您可以具体更改的.spec.template.spec.containers[].env[].value方法ISTIO_META_OWNER使用|= sub()

下面是替换的应用方式:

jq -r '.spec.template.spec.containers[].env[] | (select(.name=="ISTIO_META_OWNER") |.value |= sub("xxx$"; "yyy"))' kubernetes_spec_example.json

结果如下:

{
  "name": "ISTIO_META_OWNER",
  "value": "kubernetes://apis/apps/v1/namespaces/istio-system/deployments/yyy"
}

答案2

下面使用将value 节点对应的节点末尾的jq替换为。xxxyyyvaluenameISTIO_META_OWNER

jq '( .spec.template.spec.containers[].env[] | select(.name == "ISTIO_META_OWNER").value ) |= sub("xxx$"; "yyy")' file.json

这用于将值中sub("xxx$"; "yyy")匹配的文本替换为。是一个正则表达式锚,将表达式锚定到字符串的末尾。xxx$yyy$

结果是

{
  "spec": {
    "template": {
      "spec": {
        "containers": [
          {
            "args": [
              "proxy",
              "router",
              "--domain",
              "$(POD_NAMESPACE).svc.cluster.local",
              "--proxyLogLevel=warning",
              "--proxyComponentLogLevel=misc:error",
              "--log_output_level=default:info",
              "--serviceCluster",
              "istio-ingressgateway"
            ],
            "env": [
              {
                "name": "JWT_POLICY",
                "value": "third-party-jwt"
              },
              {
                "name": "ISTIO_META_OWNER",
                "value": "kubernetes://apis/apps/v1/namespaces/istio-system/deployments/yyy"
              }
            ]
          }
        ]
      }
    }
  }
}

以下是一种稍微更加模块化的方法,它删除/值中最后一个之后的所有内容,并将其替换为newval变量在命令行上设置的任何值jq

jq --arg newval 'yyy' '(.spec.template.spec.containers[].env[] | select(.name == "ISTIO_META_OWNER").value) |= sub("[^/]*$"; $newval)' file.json

请注意,yyy在此命令中,将自动正确进行 JSON 编码jq

相关内容