当前位置:  开发笔记 > 编程语言 > 正文

通过词典jq - shell迭代

如何解决《通过词典jq-shell迭代》经验,为你挑选了1个好方法。

我有这样的JSON

{
  "images" : [
    {
      "size" : "29x29",
      "idiom" : "iphone",
      "filename" : "Icon-Small@2x.png",
      "scale" : "2x"
    }
     ......
     ......
    {
      "size" : "60x60",
      "idiom" : "iphone",
      "filename" : "Icon-60@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

我想遍历images数组中的每个字典.为此我写了

declare -a images=($(cat Contents.json | jq ".images[]"))
for image in "${images[@]}"
do
    echo "image --$image"
done

我期待每个字典在迭代中打印的输出.那是

image --{
  "size" : "29x29",
  "idiom" : "iphone",
  "filename" : "Icon-Small@2x.png",
  "scale" : "2x"
}
image --{
  "size" : "29x29",
  "idiom" : "iphone",
  "filename" : "Icon-Small@3x.png",
  "scale" : "3x"
}
image --{
  "size" : "40x40",
  "idiom" : "iphone",
  "filename" : "Icon-Spotlight-40@2x.png",
  "scale" : "2x"
}

等等

但它遍历每个字典中的每个元素,如

image --{
image --"size":
image --"29x29",
image --"idiom":
image --"iphone",
image --"filename":
....
....
....

我的代码有什么问题



1> hek2mgl..:

您的代码的问题是bash中的数组初始化如下所示:

declare -a arr=(item1 item2 item3)

项目由空格或换行符分隔.您还可以使用:

declare -a arr(
    item1
    item2
    item3
)

但是,jq示例中的输出包含空格和换行符,这就是报告的行为符合预期的原因.


解决方法:

我先得到密钥,将它们传递给一个读取循环,然后调用jq列表中的每个项目:

jq -r '.images|keys[]' Contents.json | while read key ; do
    echo "image --$(jq ".images[$key]" Contents.json)"
done

jq如果您不关心漂亮的打印,也可以使用此命令:

jq -r '.images[]|"image --" + tostring' Contents.json

要访问子阵列的某个属性,您可以使用:

jq -r '.images|keys[]' Contents.json | while read key ; do
    echo "image --$(jq ".images[$key].filename" Contents.json)"
done

例如,上述节点将打印每个节点的filename属性.

但是,这可以更简单地表达,jq仅使用:

jq -r '.images[]|"image --" + .filename' Contents.json

甚至更简单:

jq '"image --\(.images[].filename)"' Contents.json

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有