用jq替换json中的一些键

用jq替换json中的一些键,json,jq,Json,Jq,我有这样一个json文件: { "abc": "A", "abc-release": "B", "bcd":"C", "cde-release":"D", "cde":"E" } 并希望得到如下结果文件: { "abc": "B", "bcd":"C", "cde":"D" } 即: 如果我们也有密钥X-release,则删除密钥X的所有元素; 将键为X-release的元素重命名为X; 需要通过使用像jq和sed这样的Linu

我有这样一个json文件:

{
    "abc": "A",
    "abc-release": "B",
    "bcd":"C",
    "cde-release":"D",
    "cde":"E"
}
并希望得到如下结果文件:

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

如果我们也有密钥X-release,则删除密钥X的所有元素; 将键为X-release的元素重命名为X; 需要通过使用像jq和sed这样的Linux命令来实现这一点。最好作为一个内衬与管道

我已经花了好几个小时试图实现它,我能做的最好的事情就是这个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) } )


以下使用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) } )