JQ:执行令牌替换

JQ: perform token replacement

我想用 ma 中定义的变量替换 text 中的标记。输入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 ?

我试过使用 scansub 以及 walk 的组合,但无法弄清楚。

谢谢!

定义一个函数来用新值替换标记。

def format($map): gsub("\{(?<key>[^}]+)\}"; "\($map[.key])");

有了这个,您就可以传入地图进行替换。

.ma as $map | .text | format($map)

根据需要更新映射。

(.ma * .mb) as $map | .text | format($map)

如果您受困于 {a} 风格的模板名称,请参阅@JeffMercado 的回答;但是,如果您可以控制模板样式,那么使用 jq 的字符串插值功能会使事情变得简单得多。

例如,如果模板字符串 (.text) 是 "https://ph.com?a=\(.a)&b=\(.b)" 那么如果您只想在替换后得到 .text 的值,您可以简单地写:

(.ma + .mb) as $map | .text | $map

或者如果您想要就地替换:

(.ma + .mb) as $map
| .text |= $map