Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Awk 从html文件中搜索出url,然后选择最上面的一个_Awk_Grep_Html Parsing - Fatal编程技术网

Awk 从html文件中搜索出url,然后选择最上面的一个

Awk 从html文件中搜索出url,然后选择最上面的一个,awk,grep,html-parsing,Awk,Grep,Html Parsing,我有很多(比如17000个)包含链接的html文件。每个html文件可以包含许多链接,但它们都引用相同的视频mp4,但分辨率不同。我只想grep出最高分辨率的链接,也就是说,如果有720、1080或1440的引用,我想要1440的链接,而不是其他的链接。但最大分辨率各不相同,因此我不能只硬编码1440(例如,在另一个1440中,一个html文件中的最大分辨率可能是720) html文件的内容每个都在2k到80k之间,并且具有具有这种结构的重复内容,有时在一行中,有时跨越多行 {"url":"ht

我有很多(比如17000个)包含链接的html文件。每个html文件可以包含许多链接,但它们都引用相同的视频mp4,但分辨率不同。我只想grep出最高分辨率的链接,也就是说,如果有720、1080或1440的引用,我想要1440的链接,而不是其他的链接。但最大分辨率各不相同,因此我不能只硬编码1440(例如,在另一个1440中,一个html文件中的最大分辨率可能是720)

html文件的内容每个都在2k到80k之间,并且具有具有这种结构的重复内容,有时在一行中,有时跨越多行

{"url":"https://localhost/676/hg66333/56354446353.mp4?user=893668f5-8fab-4916-9697-f45aee61aa01", 
uploadedBy="fdb778f8-c347-4c28-90f4-d8be4b4a20f0", 
 owner="3ba62dba-8fb1-468d-8349-2e42a5330785",video="1024p", 
   group="a4307f09-4804-4802-9ba4-8e8eaf3d3439"},
   {"url":"https://localhost/676/hg66333/56354446384.mp4?user=893668f5-8fab-4916-9697-f45aee61aa01", 
 uploadedBy="fdb778f8-c347-4c28-90f4-d8be4b4a20f0", 
       owner="3ba62dba-8fb1-468d-8349-2e42a5330785",
    video="720p", group="a4307f09-4804-4802-9ba4-8e8eaf3d3439"}
我想从grep那里得到的只是

而不是(因为这是较低的分辨率,单个文件中的最高分辨率为1024,较低的分辨率为720)

使用grep-oh和“\”url\”:\“^”]我无法找到解决方案*

我想我需要做的是得到所有的url,视频=,按url排序,然后视频从高到低,然后取最上面的一个,但是。。。。。我不知道,现在只是摸索着尝试我能在谷歌上找到的任何东西,并改变它

有人能帮忙吗

哦,mp4总是出现在视频质量之前


我正在使用Darwin MacBook-Pro.local 18.6.0 Darwin内核版本18.6.0:Thu Apr 25 23:49:07 PDT 2019;root:xnu-4903.261.4~4/使用标准UNIX工具(包括任何UNIX机箱上任何shell中的任何awk)发布\u X86\u 64 X86\u 64

$ cat tst.awk
BEGIN { OFS="\t" }
{
    while ( match($0,/("url":|[[:alpha:]]+=)"[^"]+"/) ) {
        tag = val = substr($0,RSTART,RLENGTH)
        $0 = substr($0,RSTART+RLENGTH)
        sub(/[:=].*/,"",tag)
        sub(/[^:=]*[:=]/,"",val)
        gsub(/^"|"$/,"",tag)
        gsub(/^"|"$/,"",val)
        f[tag] = val
        if ( tag == "video" ) {
            print f["video"], f["url"]
        }
    }
}


它所依赖的只是任何给定的tag=value字符串本身并不是跨行拆分的,它们都遵循您在问题中显示的格式。

使用标准UNIX工具,包括任何UNIX框上任何shell中的任何awk:

$ cat tst.awk
BEGIN { OFS="\t" }
{
    while ( match($0,/("url":|[[:alpha:]]+=)"[^"]+"/) ) {
        tag = val = substr($0,RSTART,RLENGTH)
        $0 = substr($0,RSTART+RLENGTH)
        sub(/[:=].*/,"",tag)
        sub(/[^:=]*[:=]/,"",val)
        gsub(/^"|"$/,"",tag)
        gsub(/^"|"$/,"",val)
        f[tag] = val
        if ( tag == "video" ) {
            print f["video"], f["url"]
        }
    }
}


它所依赖的只是任何给定的tag=value字符串本身并不是跨行拆分的,它们都遵循您在问题中显示的格式。

这是一个非常通用的解决方案。多亏了while循环,这将处理任何文件。包含多个条目的单行文件。这是一个很好的解决方案。@Steve这解决了你的问题吗?你对此有什么问题吗?这是一个非常通用的解决方案。多亏了while循环,这将处理任何文件。包含多个条目的单行文件。这是一个很好的解决方案。@Steve这解决了你的问题吗?你对此有什么问题吗?