![jq를 사용하여 특정 키의 값을 바꾸는 방법은 무엇입니까?](https://linux55.com/image/14236/jq%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%ED%8A%B9%EC%A0%95%20%ED%82%A4%EC%9D%98%20%EA%B0%92%EC%9D%84%20%EB%B0%94%EA%BE%B8%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
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
.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
.