使用jq从数组中弹出最后一个字符串并返回整个json对象

时间:2018-02-02 17:36:34

标签: bash jq

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

2 个答案:

答案 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的优秀答案的一个稍微简单的变体,但确实使用spongemoreutils的一部分),重点是sponge保留指定文件的权限:

jq '.Statement[0].Condition.IpAddress["aws:SourceIp"] |= .[:-1]' test.json |
  sponge test.json