如何替换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
下面使用将value 节点对应的节点末尾的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
。