请教个 ilnux shell 的正则提取用 sed 还是 grep ?

2018-02-10 08:58:17 +08:00
 brotherlegend

最近在学 linux shell 一直学不会 sed 与  grep 的用法,希望大佬指点一下

打算用来提取 html 里面的内容,测试代码如下

<tr border=0>
<tr><td valign=top>
<div id="leftside">
  <div class="clear">
  </div>
  <div id="playvideo">
    <div id="playvideo-videoname">
            韩式 Sussi
        </div>
    <div id="playvideo-content">
      <div class="arrow-general">
        &nbsp;
      </div>    
        <div class="videoplayer">
            <video id="vid" class="video-js vjs-default-skin vjs-big-play-centered"
        controls preload="auto" width="465" height="360"
         poster="http://img2.aliyun.com/thumb/FA13AS3456XVB.jpg"      >
      <source src="http://v.advideos.com//mp43/FA13AS3456XVB.mp4?st=boGNNUn6--7TxTJJ8uKtjA&e=1518240294" type='video/mp4'>
            </div>
        </div>
    </div>
</div>
</div>
</tr>
</table>

1、想要提取

<div id="playvideo-videoname">
            韩式 Sussi
        </div>

里面的 韩式 Sussi

2、和

<source src="http://v.advideos.com//mp43/FA13AS3456XVB.mp4?st=boGNNUn6--7TxTJJ8uKtjA&e=1518240294" type='video/mp4'>

里面的 http://v.advideos.com//mp43/FA13AS3456XVB.mp4?st=boGNNUn6--7TxTJJ8uKtjA&e=1518240294 url ,当面页面里面可能有好几个 标签 ,判断唯一的另一个依据就是字串有带 .mp4

听说 sed 只能按行来提,这样的话第一个要提取的内容老是提不出来。第二个因为是在 src 里面而且通配另一个字串,原谅我正则表达 式真的看不懂。

请大佬们解惑。

7054 次点击
所在节点    Linux
39 条回复
loginv2
2018-02-10 08:59:24 +08:00
都不用.用 awk
loginv2
2018-02-10 09:00:56 +08:00
好像也不对,话说回来正常情况下不应该用正则,应该解析 xml
brotherlegend
2018-02-10 09:03:04 +08:00
@loginv2 那如果 html 格式不规范的话 解析岂不是会失败?
nightcat
2018-02-10 09:07:57 +08:00
sed -A1 是加上匹配条目的后一行,sed -B1 是加上前一行,行数可以换,应该能满足你第一条要求。。。
nightcat
2018-02-10 09:09:51 +08:00
@nightcat 打错了是 grep 不是 sed
mingongge
2018-02-10 09:22:52 +08:00
专注于 linux 系统运维、运维架构、各类高可用技术,热衷于分享开源技术,热爱开源、拥抱开源!!我是 80 后民工哥,微信公众号:民工哥 linux 运维,我为自己代言,谁说 80 后不能活出精彩人生!!!
关于 命令三剑客的文章可以参考下面的链接
https://mp.weixin.qq.com/s?__biz=MzI0MDQ4MTM5NQ==&mid=2247484807&idx=1&sn=9fd2359b67d45aa9ea3f23231a19dc1c&chksm=e91b609bde6ce98d000b7e377867c6d45a56eb85343dfd345c8a38f7180f850f0956ff972add#rd
boboliu
2018-02-10 09:39:46 +08:00
为啥不直接 beautifulsoup 呢。。。
iac
2018-02-10 09:40:14 +08:00
sed -n '/playvideo-videoname/,+2{/1/n;p}' test.log
lulinux
2018-02-10 09:51:36 +08:00
sed 功能稍微强大一点。
singer
2018-02-10 10:04:11 +08:00
awk 正则
uyhyygyug1234
2018-02-10 10:11:44 +08:00
pyquery bs4 啊!!
jianguiqubaa
2018-02-10 10:19:13 +08:00
https://github.com/ericchiang/pup


pup is a command line tool for processing HTML. It reads from stdin, prints to stdout, and allows the user to filter parts of the page using CSS selectors.

Inspired by jq, pup aims to be a fast and flexible way of exploring HTML from the terminal.


另外一个思路
wampyl
2018-02-10 10:22:30 +08:00
bs4 吧。或者 sed 提取出.mp4 那一行,然后再用 awk 处理
jianguiqubaa
2018-02-10 10:26:55 +08:00
v2er 写的工具 https://github.com/shinima/temme

这个也挺不错
lance6716276
2018-02-10 11:00:15 +08:00
HTML 不是正则语言吧…
wweir
2018-02-10 12:00:22 +08:00
两条命令

sed -n -E '/playvideo-videoname/{n;s/^\s*(.*?)\s*$/\1/p}'

awk -F '"' '/advideos.com/{print $2}'
wweir
2018-02-10 12:02:20 +08:00
@wweir 写正则的风格比较严谨,所以看着会有点抽象
xiaq
2018-02-10 12:03:28 +08:00
coolxl
2018-02-10 12:03:47 +08:00
第一个:过滤出关键字 “ playvideo-videoname ”的下一行 grep -A 1 ‘ playvideo-videoname ’ file
第二个:过滤出关键字“ source src ”的行,再 awk 用 “ 作分隔符,取第二段。grep 'source src' |awk -F '"' '{print $2}' file
brotherlegend
2018-02-10 12:27:12 +08:00
@boboliu 如果用 python 就简单啦,就是只想用 shell

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/429924

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX