如何在对象中搜索字符串,并根据条件将其替换为另一个值



我有一个Json文件下面的内容,我试图替换serviceName字符串从ca-visual-nodeca-visual-node-canary如果主机名匹配test4.analytics.io使用jq实用程序。我怎样才能做到这一点,使json文件更新为替换字符串


{
"apiVersion": "extensions/v1beta1",
"kind": "Ingress",
"metadata": {
"annotations": {
"alb.ingress.kubernetes.io/actions.ssl-redirect": "{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}"
},
"finalizers": [
"ingress.k8s.aws/resources"
],
"name": "ca-visual",
"namespace": "cloud-anaytics",
},
"spec": {
"rules": [
{
"host": "test.analytics.io",
"http": {
"paths": [
{
"backend": {
"serviceName": "ca-visual-play",
"servicePort": 9443
},
"path": "/apii/*",
"pathType": "ImplementationSpecific"
},
{
"backend": {
"serviceName": "ssl-redirect",
"servicePort": "use-annotation"
},
"path": "/*",
"pathType": "ImplementationSpecific"
},
{
"backend": {
"serviceName": "ca-visual-node",
"servicePort": 443
},
"path": "/*",
"pathType": "ImplementationSpecific"
}
]
}
},
{
"host": "test4.analytics.io",
"http": {
"paths": [
{
"backend": {
"serviceName": "ca-visual-play",
"servicePort": 9443
},
"path": "/apii/*",
"pathType": "ImplementationSpecific"
},
{
"backend": {
"serviceName": "ssl-redirect",
"servicePort": "use-annotation"
},
"path": "/*",
"pathType": "ImplementationSpecific"
},
{
"backend": {
"serviceName": "ca-visual-node",
"servicePort": 443
},
"path": "/*",
"pathType": "ImplementationSpecific"
}
]
}
}
]
},
"status": {
"loadBalancer": {
"ingress": [
{
"hostname": "16b3-cloudanaytics.us-xxxx-1.elb.amazonaws.com"
}
]
}
}
}

我试图将serviceName字符串从ca-visual-node替换为ca-visual-node-canary如果主机名匹配test4.analytics.io使用jq实用程序。我怎样才能做到这一点,使我们将有json文件更新与替换字符串。

从根目录开始遍历路径,使用更新操作符|=,并在(..)周围包裹过滤器

( 
.spec.rules[]                             | 
select(.host == "test4.analytics.io")?    | 
.http.paths[].backend                     | 
select(.serviceName == "ca-visual-node")? |
.serviceName
)  |= "ca-visual-node-canary"

jqplay - demo

最新更新