2

我正在做一些文本处理来查找用户上传的 html 文件中的视频内容。所以我们定义了一个名为“video”的标签,用户应该把视频文件像

<video> abcd.mp4 </video>

目前我正在使用 awk 提取具有视频标签的行,

str=$(awk '/<video>/{flag=1;} /<\/video>/{print ;flag=0} flag { print }' file.html)

输出也包含标签,所以我删除前缀和后缀来获取视频文件名。它是这样完成的,

prefix="<video>"
suffix="</video>"              
foo=${str#$prefix}
foo=${foo%$suffix}

但这仅适用于仅使用一次视频标签的文件。对于多次使用标签的文件,awk 返回的字符串从第一次出现<video>到最后一次出现</video>.

所以我的问题是我应该如何编写一个脚本,它最后会给我一个包含所有字符串<video></video>标签的数组。另外我该如何更改

<video> abcd.mp4 </video>

<media> abcd.mp4 </media>.
4

2 回答 2

2

要单独获取每个标签:

grep -Eo "<video>(.+?)</video>" myfile.html

要仅获取标签中的文本:

grep -Eo "<video>(.+?)</video>" myfile.html | sed -E "s|</?video>||g"

如果开始和结束标签在不同的行:

tr "\n" " " < myfile.html | grep -Eo "<video>(.+?)</video>" | sed -E "s|</?video>||g"

示例输入:

This is a <video> video1.mp4 </video>  file with <other> <random> </tags>
<media> media1.mp4 </media> 
<video> video2.mp4 </video> 
<media>     media 2 with spaces 
and over 
multiple lines.mp4 </media>

示例输出:

video1.mp4 
video2.mp4 

要同时获取videomedia标签(请在您的原始问题中指定):

tr "\n" " " < vid.html | grep -Eo "<(video|media)>(.+?)</(video|media)>"  | sed -E "s#</?(video|media)>##g"

输出:

 video1.mp4 
 media1.mp4 
 video2.mp4 
 media 2 with spaces      and over      multiple lines.mp4 

对于第二个问题,通过以下命令运行整个文件:

sed -E "s|(</?)video>|\1media>|g" vid.html
于 2013-10-07T15:21:51.437 回答
1

尝试这个:

$ cat tst.awk
BEGIN{
    stag = "<"  tag ">"
    etag = "</" tag ">"
}

pos = index($0,stag) {
    $0 = substr($0,pos+length(stag)) 
    rec = ""
    inTag = 1
}

inTag {
    if (pos = index($0,etag)) {
        rec = rec substr($0,1,pos-1) 
        gsub(/^[[:space:]]+|[[:space:]]+$/,"",rec)
        print "<" rec ">"
        inTag = 0
    }
    else {
        rec = rec $0 ORS
    }
}
$ 
$ cat file
<video> video1.mp4 </video>
<media> media1.mp4 </media>
<video>
video2.mp4 </video>
<media> media 2 with
spaces and
over multiple
lines.mp4
</media>
$ 
$ awk -v tag="video" -f tst.awk file
<video1.mp4>
<video2.mp4>
$   
$ awk -v tag="media" -f tst.awk file
<media1.mp4>
<media 2 with
spaces and
over multiple
lines.mp4>

在您了解并对其所做的事情感到满意之后更改print "<" rec ">"为。print rec

于 2013-10-07T15:58:11.160 回答