我正在进行少量文字处理,以便在用户上传的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>.
答案 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
同时获取video
和media
代码(请在原始问题中注明):
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
,并对其正在做的事情感到满意。