【问题标题】:JQ: perform token replacementJQ:执行令牌替换
【发布时间】:2019-02-25 00:30:49
【问题描述】:

我想将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 的组合,但无法弄清楚。

谢谢!

【问题讨论】:

    标签: json jq template-engine


    【解决方案1】:

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

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

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

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

    根据需要更新映射。

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

    【讨论】:

      【解决方案2】:

      如果您坚持使用{a} 样式的模板名称,请参阅@JeffMercado 的答案;但是,如果您可以控制模板样式,那么如果您使用 jq 的字符串插值功能,事情就会变得更加简单。

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-19
        • 2012-04-10
        • 1970-01-01
        • 1970-01-01
        • 2014-02-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多