Как с помощью jq заменить значение определенного ключа?

Команда statдолжна обрабатывать это:

stat -c "%a %n" /path/to/your/file

Ваши конкретные права доступа к файлам представлены восьмеричной1755

2
11.04.2021, 12:20
2 ответа

Вот как вы можете специально изменить .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"
}
1
28.04.2021, 22:54

Далее jqиспользуется для замены xxxна yyyв конце узла value, соответствующего узлу nameсо значением ISTIO_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.

0
28.04.2021, 22:54

Теги

Похожие вопросы