JQ:执行令牌替换

时间:2018-09-20 16:26:49

标签: json jq template-engine

我想用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

我尝试使用scansubwalk的组合,但无法弄清楚。

谢谢!

2 个答案:

答案 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