我想用text
中定义的变量替换ma
中的标记。输入JSON:
{
"ma":{
"a":"1",
"b":"2",
"c":"3"
},
"mb":{
"a":"11"
},
"text":"https://ph.com?a={a}&b={b}"
}
期望的结果:https://ph.com?a=1&b=2
特别感谢,我如何让mb
变量优先于ma
变量,这样我得到的文本为:https://ph.com?a=11&b=2
?
我尝试使用scan
和sub
和walk
的组合,但无法弄清楚。
谢谢!
答案 0 :(得分:2)
定义一个函数以新值替换令牌。
def format($map): gsub("\\{(?<key>[^}]+)\\}"; "\($map[.key])");
这样,您就可以在地图中传递替换品了。
.ma as $map | .text | format($map)
根据需要更新映射。
(.ma * .mb) as $map | .text | format($map)
答案 1 :(得分:1)
如果您坚持使用{a}
样式的模板名称,请参阅@JeffMercado的答案;但是,如果您可以控制模板样式,则使用jq的字符串插值功能会使事情简单得多。
例如,如果模板字符串(.text)为"https://ph.com?a=\\(.a)&b=\\(.b)"
,那么如果您只希望替换后的.text
值,则可以简单地写:
(.ma + .mb) as $map | .text | $map
或者如果您想就地替换:
(.ma + .mb) as $map
| .text |= $map