test.json
{
"Version": "2012-**-**",
"Statement": [
{ "Effect": "**",
"Principal": "**",
"Action": "**",
"Resource": "***",
"Condition": {
"IpAddress": {
"aws:SourceIp": [ "127.0.0.1", "1.0.0.2" ]
}
}
}
]
}
我想弹出aws数组:SourceIp,以便删除1.0.0.2或数组的最后一个元素。 返回值应该是整个json对象,数组缺少1.0.0.2。
我已接近这个:
echo $(jq '.Statement[0] .Condition.IpAddress."aws:SourceIp" | .[0:-1] ' test.json ) > test.json
借助: https://github.com/stedolan/jq/issues/226
这将弹出数组的最后一个元素,但只返回[" 127.0.0.1"],然后将其推送到test.json。
我希望它返回整个json修改,以便我可以推入test.JSON
答案 0 :(得分:2)
使用|=
就地修改该部分但返回较大的文档。
tempfile=$(mktemp test.json.XXXXXX)
trap 'rm -f -- "$tempfile"' EXIT
if jq '.Statement[0].Condition.IpAddress["aws:SourceIp"] |= .[0:-1]' \
<test.json >"$tempfile"; then
chmod --reference=test.json -- "$tempfile" # this is a GNUism; tweak elsewhere.
mv -- "$tempfile" test.json
else
rm -f -- "$tempfile"
fi
此版本还需要更加谨慎地用一种永远不会留下部分书写内容的方式替换文件。
答案 1 :(得分:0)
这基本上只是@ CharleDuffy的优秀答案的一个稍微简单的变体,但确实使用sponge
(moreutils
的一部分),重点是sponge
保留指定文件的权限:
jq '.Statement[0].Condition.IpAddress["aws:SourceIp"] |= .[:-1]' test.json |
sponge test.json