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
?
我试过使用 scan
和 sub
以及 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
我想用 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
?
我试过使用 scan
和 sub
以及 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