jq를 사용하여 특정 키의 값을 바꾸는 방법은 무엇입니까?

jq를 사용하여 특정 키의 값을 바꾸는 방법은 무엇입니까?

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/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

다음을 사용하여 값 노드에 해당하는 노드의 끝을 교체합니다 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

이 명령 에서는 yyyJSON 인코딩이 자동으로 올바르게 수행됩니다 jq.

관련 정보