下载JSON文件中的URL,包括,以及以不同的字符串结尾

时间:2018-03-19 09:58:00

标签: regex curl grep xargs

我运行了一个终端命令来下载提供的JSON文件中包含的所有URL:

egrep -o 'https:[^\"]*png' file-name.json | xargs -n 1 curl -O

这可以按预期工作,但有些网址位于不同的子文件夹中,例如:

https://website.com/a-folder-name/display/image.png

https://website.com/another-folder-name/display-side/image.png

https://website.com/a-different-folder-name/thumb/image.png

我想调整此命令只检索指定文件夹名称中的文件(因此我可以再次运行命令,将子文件夹名称更改为仅检索每个文件夹中的图像),例如:

  • http:
  • 开头的文件名
  • 文件名包括 display-sides
  • png
  • 结尾的文件名

以下是我的JSON数据示例:

{
  "parent_groups": [
    {
      "id": 1,
      "name": "Main name",
      "groups": [
        {
          "id": 3,
          "name": "Sub Name",
          "components": [
            {
              "id": "id-number",
              "name": "Unit name",
              "image": "https://website.com/a-folder-name/display/image.png"
            },
            {
              "id": "another-id-number",
              "name": "Another Unit name",
              "image": "https://website.com/another-folder-name/display/another-image.png"
            }
          ]
        }
      ]
    }
  ],
  "display": {
    "side": {
      "components": [
        {
          "id": "side-id",
          "filename": "https://website.com/another-folder-name/display-side/image.png"
        },
        {
          "id": "another-side-id",
          "filename": "https://website.com/some-folder-name/display-side/another-image.png"
        }
      ]
    },
    "main": [
      {
        "position": 0,
        "conditions": [
          {
            "ids": [
              "thumb-id9"
            ],
            "filename": "https://website.com/irrelevant-folder-name/thumb/image.png"
          },
          {
            "ids": [
              "another-thumb-id"
            ],
            "filename": "https://website.com/this-is-a-folder-name/thumb/another-image.png"
          }
        ]
      }
    ]
  }
}

这大大减少了我使用的文件,但希望作为一个相关的例子。

3 个答案:

答案 0 :(得分:2)

grep不是处理JSON数据的正确工具。

使用jq工具的正确方法:

jq '.. | select(type =="string" and 
                test("^https://.+display-side.+\\.png$"))' file-name.json | xargs -n1 curl -O

这将找到与关键名称无关的所有网址 此外,它可以扩展为仅分析某些键。

答案 1 :(得分:1)

这样的东西?

egrep -o 'https:[^"]*/display-sides/[^"]*png' file-name.json | xargs -n 1 curl -O

通过考虑周围的引号,可以使这更加健壮:

egrep -o '"https:[^"]*/display-sides/[^"]*png"' file-name.json | tr -d '"' | xargs -n 1 curl -O

如果您愿意,也可以省略png文件扩展名。

答案 2 :(得分:0)

@Roman是对的,如果您真正寻找的是JSON结构中的字段:

jq -r '.display.side.components[].filename' foo.json |
  parallel curl -O