如何通过jq程序化地将URI从virtual_endpoint追加到vs_endpoints?
解决jq追加URI到vs_endpoints的问题
嘿,我来帮你搞定这个jq的收尾工作!听起来你已经完成了大部分步骤,就差把virtual_endpoint里的URI字段追加到每个vs_endpoints元素里了,这事儿用jq其实挺直接的。
首先先假设你的main.json当前的结构大概是这样(如果实际结构有出入,后面可以调整路径):
{ "virtual_endpoint": { "uri": "/api/v2/service" }, "vs_endpoints": [ { "id": "vs-001", "target": "192.168.1.10" }, { "id": "vs-002", "target": "192.168.1.11" } ] }
你可以用这条jq命令来实现需求:
jq '.vs_endpoints[] += {uri: .virtual_endpoint.uri}' main.json
我来拆解下这条命令的逻辑:
.vs_endpoints[]:遍历vs_endpoints数组里的每一个元素+=:给每个遍历到的元素追加新的键值对(而不是覆盖原有内容){uri: .virtual_endpoint.uri}:从顶层的virtual_endpoint对象里取出uri的值,包装成新的uri字段添加到每个vs_endpoints元素中
执行完这条命令后,输出的结果就会是你想要的样子:
{ "virtual_endpoint": { "uri": "/api/v2/service" }, "vs_endpoints": [ { "id": "vs-001", "target": "192.168.1.10", "uri": "/api/v2/service" }, { "id": "vs-002", "target": "192.168.1.11", "uri": "/api/v2/service" } ] }
如果想直接修改原文件(jq默认只是输出到控制台,不会修改原文件),可以用临时文件中转:
jq '.vs_endpoints[] += {uri: .virtual_endpoint.uri}' main.json > temp.json && mv temp.json main.json
或者如果你安装了moreutils工具包,用sponge更方便(避免临时文件):
jq '.vs_endpoints[] += {uri: .virtual_endpoint.uri}' main.json | sponge main.json
要是你的virtual_endpoint不在顶层(比如嵌套在某个子对象里),只需要调整.virtual_endpoint.uri的路径就行,比如如果它在.config.virtual_endpoint下,就改成{uri: .config.virtual_endpoint.uri}。
内容的提问来源于stack exchange,提问作者Vicxtel0015
相关产品推荐
相关产品推荐

