来自html:BASH的子串提取

时间:2012-10-03 14:22:06

标签: html string bash extract

我需要从youtube的index.html中提取视频名称。我已经能够将文件拆分成小块,每个块包含一个视频列表,但我似乎无法提取视频标题。我的教授提供了以下命令,但是我似乎无法在这种情况下使用它。

number=`expr "$s" : ".*\/\([0-9,]*\)\/"`; echo $number # will print 250,4211

虽然我不完全确定,但我认为我无法使用此方法,因为视频标题和周围文本之间没有空格。以下是从标题中提取标题所需的示例:

<li class="video-list-item "><a href="/watch?v=9BbgvlgDQMg&amp;feature=g-sptl&amp;cid=inp-hs-edt" class="video-list-item-link yt-uix-sessionlink" data-sessionlink="ei=CMzmroaB5bICFRiXIQoda3kX5g%3D%3D&amp;feature=g-sptl%26cid%3Dinp-hs-edt" ><span class="ux-thumb-wrap contains-addto "><span class="video-thumb ux-thumb yt-thumb-default-120 "><span class="yt-thumb-clip"><span class="yt-thumb-clip-inner"><img src="http://s.ytimg.com/yt/img/pixel-vfl3z5WfW.gif" alt="Lil&#39; Buck &quot;Golden Gateway&quot; Venice Beach California YAK FILMS Super Bowl 2012 Madonna Memphis Jookin" data-thumb="//i2.ytimg.com/vi/9BbgvlgDQMg/default.jpg" width="120" ><span class="vertical-align"></span></span></span></span><span class="video-time">3:51</span>

在这一大块文字中,我需要提取“ Lil'Buck”Golden Gateway“威尼斯海滩加州牦牛电影超级碗2012麦当娜孟菲斯Jookin ”,不加引号。

2 个答案:

答案 0 :(得分:1)

您可以使用bash正则表达式\<img.*alt=\"([^\"]*)\"从img元素中提取替代文字。

示例:

$ cat file
<li class="video-list-item "><a href="/watch?v=9BbgvlgDQMg&amp;feature=g-sptl&amp;cid=inp-hs-edt" class="video-list-item-link yt-uix-sessionlink" data-sessionlink="ei=CMzmroaB5bICFRiXIQoda3kX5g%3D%3D&amp;feature=g-sptl%26cid%3Dinp-hs-edt" ><span class="ux-thumb-wrap contains-addto "><span class="video-thumb ux-thumb yt-thumb-default-120 "><span class="yt-thumb-clip"><span class="yt-thumb-clip-inner"><img src="http://s.ytimg.com/yt/img/pixel-vfl3z5WfW.gif" alt="Lil&#39; Buck &quot;Golden Gateway&quot; Venice Beach California YAK FILMS Super Bowl 2012 Madonna Memphis Jookin" data-thumb="//i2.ytimg.com/vi/9BbgvlgDQMg/default.jpg" width="120" ><span class="vertical-align"></span></span></span></span><span class="video-time">3:51</span>

$ line="$(cat file)"

$ if [[ "$line" =~ \<img.*alt=\"([^\"]*)\" ]]
then
  echo "${BASH_REMATCH[1]}"
fi
Lil&#39; Buck &quot;Golden Gateway&quot; Venice Beach California YAK FILMS Super Bowl 2012 Madonna Memphis Jookin

<强>更新

使用expr

$ expr "$line" : '.*<img.*alt=\"\([^\"]*\)\".*'
Lil&#39; Buck &quot;Golden Gateway&quot; Venice Beach California YAK FILMS Super Bowl 2012 Madonna Memphis Jookin

答案 1 :(得分:0)

我认为在你的作业中使用正则表达式是强制性的......如果不是我会选择xml解析器......

但如果是,我建议你选择Reg Ex buddy

RegexBuddy让您可以比以往更轻松地创建符合您意图的正则表达式,而无需任何猜测。不过,你需要测试你的正则表达式模式是100%确定它们符合你想要的,并且与你不想要的不匹配。