用jq替换json中的一些键
我有这样一个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
{
"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) } )