最近在学 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">
         
      </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  ,当面页面里面可能有好几个
听说 sed 只能按行来提,这样的话第一个要提取的内容老是提不出来。第二个因为是在 src 里面而且通配另一个字串,原谅我正则表达 式真的看不懂。
请大佬们解惑。
|  |      1loginv2      2018-02-10 08:59:24 +08:00 via Android 都不用.用 awk | 
|  |      2loginv2      2018-02-10 09:00:56 +08:00 via Android 好像也不对,话说回来正常情况下不应该用正则,应该解析 xml | 
|      3brotherlegend OP @loginv2 那如果 html 格式不规范的话 解析岂不是会失败? | 
|  |      4nightcat      2018-02-10 09:07:57 +08:00 sed -A1 是加上匹配条目的后一行,sed -B1 是加上前一行,行数可以换,应该能满足你第一条要求。。。 | 
|  |      6mingongge      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 | 
|      7boboliu      2018-02-10 09:39:46 +08:00 为啥不直接 beautifulsoup 呢。。。 | 
|  |      8iac      2018-02-10 09:40:14 +08:00 sed -n '/playvideo-videoname/,+2{/1/n;p}' test.log | 
|  |      9lulinux      2018-02-10 09:51:36 +08:00 sed 功能稍微强大一点。 | 
|  |      10singer      2018-02-10 10:04:11 +08:00 via iPhone awk 正则 | 
|  |      11uyhyygyug1234      2018-02-10 10:11:44 +08:00 pyquery  bs4 啊!! | 
|  |      12jianguiqubaa      2018-02-10 10:19:13 +08:00  1 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. ” 另外一个思路 | 
|  |      13raslan      2018-02-10 10:22:30 +08:00 via iPhone bs4 吧。或者 sed 提取出.mp4 那一行,然后再用 awk 处理 | 
|  |      14jianguiqubaa      2018-02-10 10:26:55 +08:00 | 
|      15lance6716276      2018-02-10 11:00:15 +08:00 via Android HTML 不是正则语言吧… | 
|  |      16wweir      2018-02-10 12:00:22 +08:00  1 | 
|      18xiaq      2018-02-10 12:03:28 +08:00 via iPad | 
|  |      19coolxl      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 | 
|      20brotherlegend OP @boboliu 如果用 python 就简单啦,就是只想用 shell | 
|      21brotherlegend OP @wweir 请收下我的膝盖,完美解决,我研究研究代码的意思 | 
|      22brotherlegend OP @coolxl 谢谢 等会试试 | 
|      24brotherlegend OP @liuxu 简单粗暴,牛 | 
|  |      25artandlol      2018-02-10 15:20:21 +08:00 via iPhone | 
|  |      26pkookp8      2018-02-10 19:14:51 +08:00 via Android grep -v \< 第一题,不知道是不是取巧了 | 
|  |      27pkookp8      2018-02-10 19:18:03 +08:00 via Android 突然发现楼主标题字母顺序反了... | 
|      28abscon      2018-02-10 19:50:48 +08:00 via iPhone 三个问题: 1. ilnux shell 什么鬼?不存在的。 2. linux shell 什么鬼?不存在的。 3. 为什么要用正则来解析 HTML ?用个解析器不好么? | 
|  |      29likuku      2018-02-10 23:47:02 +08:00 少年误入歧途了... | 
|      30kualalumpur      2018-02-11 00:28:22 +08:00  1 #!/usr/bin/env bash  # 一个使用 awk 和正则的解决方案 # HTML 文件变量 FILE="file.html"; cat $FILE | # 显示 HTML 文件内容 awk 'in_range && /<\/div>/ { # 结束标记 gsub(/^\s+/, "", str); #去掉开头空白 gsub(/\s+$/, "", str); #去掉尾部空白 print str; exit; } in_range { # 需要的内容 str=str $0; # awk 用空格连接字符串 } /playvideo\-videoname/ { # 开始标记 in_range=1; }'; cat $FILE | # 显示 HTML 文件内容 awk '/http(.+)\.mp4/ { # 匹配行 prefix=index($0, "http"); #查找 url=substr($0, prefix); # 移头 suffix=index(url, "\""); #查找 url=substr(url, 1, suffix - 1); # 去尾 print url; # 显示出来 }'; | 
|      31kualalumpur      2018-02-11 00:30:12 +08:00  1 | 
|  |      32feichao      2018-02-11 00:56:43 +08:00  1 如果不一定要用正则的话,用 HTML 解析工具会更方便一些 用 temme 的话这个挺方便的: https://runkit.com/shinima/snippet-for-ilnux-shell 需要先在命令行用 yarn/npm 安装 temme | 
|  |      33matsuz      2018-02-11 04:11:08 +08:00 via iPhone XPath, CSS 选择器了解一下 | 
|      34brotherlegend OP @abscon 嗯 一根筋 就是只用 shell 不打算用任何第三方 | 
|      35brotherlegend OP @kualalumpur 这个我看得懂哈哈谢谢 | 
|      36abscon      2018-02-11 09:51:22 +08:00 via iPhone  2 @brotherlegend  首先,shell 有很多种,你说的具体是哪个 shell。不同的 shell 可能有不同的语法,脚本在某个 shell 能跑,另一个可能就不行; 其次,shell 又不是专为 Linux 开发的,请不要用「 Linux shell 」这么奇怪的称呼。你学的「 Linux shell 」的经验,相当一部分都能在其他操作系统上用到; 再次,sed 和 awk 都是独立的程序,在不同的 shell 上都能用,你学的并不是 shell 而是 sed 程序和 awk 程序; 最后,正则语言相比 html 来说是有点 low 的,不一定能满足要求,想省心省力最好用 html parser。 | 
|      37brotherlegend OP @abscon 批评的是,不过这样写我的 vps 都能直接运行就 ok 拉 | 
|      38brotherlegend OP @feichao 谢谢 | 
|      39gpw1987      2018-02-15 11:58:06 +08:00 sed 取行,awk 取列 |