用jq替换json中的一些键

阴暗面

我有这样的json文件:

{
    "abc": "A",
    "abc-release": "B",
    "bcd":"C",
    "cde-release":"D",
    "cde":"E"
}

并希望得到这样的结果文件:

{
    "abc": "B",
    "bcd":"C",
    "cde":"D"
}

那是:

  1. 如果我们还有X键释放,则删除所有具有X键的元素;
  2. 将键X-release的元素重命名为X;

需要通过使用Linux命令(例如jq和)来完成这项工作sed最好是与管道一起使用。

我花了多个小时尝试实现这一点,最好的办法就是执行此jq命令,该命令返回需要删除的键数组。

jq "with_entries(select(.key|endswith(\"-release\"))) | keys | map(split(\"-\")[0])"

[
    "abc",
    "cde"
]

但是,如何以jqdel方法或其他某种方式喂入此数组以获得所需的结果呢?

第二步(重新命名元素)很容易。这可以通过jq完成,也可以在最后仅通过sed完成:

// simply like this
sed 's/-release//'
// or
sed 's/(.*)-release/$1/'

以下使用jq的构造解决方案具有简单高效的优点:

. as $in
| reduce (keys_unsorted[] | select(endswith("-release")|not)) as $k ({};
    . + {($k) : (($k + "-release") as $kr
                 | $in
                 | if has($kr) then .[$kr] else .[$k] end) } )

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章