我运行了一个终端命令来下载提供的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"
}
]
}
]
}
}
这大大减少了我使用的文件,但希望作为一个相关的例子。
答案 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