Bash脚本解析文件在模式之间多次出现的字符串

时间:2013-10-07 15:11:51

标签: regex bash shell sed awk

我正在进行少量文字处理,以便在用户上传的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>.

2 个答案:

答案 0 :(得分:1)

单独获取每个标签:

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

答案 1 :(得分: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,并对其正在做的事情感到满意。