请教个 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 里面而且通配另一个字串,原谅我正则表达 式真的看不懂。

请大佬们解惑。

6801 次点击
所在节点    Linux
39 条回复
brotherlegend
2018-02-10 12:37:59 +08:00
@wweir 请收下我的膝盖,完美解决,我研究研究代码的意思
brotherlegend
2018-02-10 12:38:50 +08:00
@coolxl 谢谢 等会试试
liuxu
2018-02-10 13:06:35 +08:00
@coolxl
第二个可以直接
grep -o "http://.*\.mp4[^\"]*"
brotherlegend
2018-02-10 14:56:18 +08:00
@liuxu 简单粗暴,牛
artandlol
2018-02-10 15:20:21 +08:00
@loginv2 最简单的不是正则,而是 jQuery

用 sed 则是先匹配到相 cclas 或者 id 然后把尖括号里面的替换位空。

还有可行的就是 python 写多次正则匹配提取内容
pkookp8
2018-02-10 19:14:51 +08:00
grep -v \<
第一题,不知道是不是取巧了
pkookp8
2018-02-10 19:18:03 +08:00
突然发现楼主标题字母顺序反了...
abscon
2018-02-10 19:50:48 +08:00
三个问题:
1. ilnux shell 什么鬼?不存在的。
2. linux shell 什么鬼?不存在的。
3. 为什么要用正则来解析 HTML ?用个解析器不好么?
likuku
2018-02-10 23:47:02 +08:00
少年误入歧途了...
kualalumpur
2018-02-11 00:28:22 +08:00
#!/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; # 显示出来
}';
kualalumpur
2018-02-11 00:30:12 +08:00
feichao
2018-02-11 00:56:43 +08:00
如果不一定要用正则的话,用 HTML 解析工具会更方便一些

用 temme 的话这个挺方便的: https://runkit.com/shinima/snippet-for-ilnux-shell
需要先在命令行用 yarn/npm 安装 temme
matsuz
2018-02-11 04:11:08 +08:00
XPath, CSS 选择器了解一下
brotherlegend
2018-02-11 09:02:47 +08:00
@abscon 嗯 一根筋 就是只用 shell 不打算用任何第三方
brotherlegend
2018-02-11 09:03:23 +08:00
@kualalumpur 这个我看得懂哈哈谢谢
abscon
2018-02-11 09:51:22 +08:00
@brotherlegend
首先,shell 有很多种,你说的具体是哪个 shell。不同的 shell 可能有不同的语法,脚本在某个 shell 能跑,另一个可能就不行;
其次,shell 又不是专为 Linux 开发的,请不要用「 Linux shell 」这么奇怪的称呼。你学的「 Linux shell 」的经验,相当一部分都能在其他操作系统上用到;
再次,sed 和 awk 都是独立的程序,在不同的 shell 上都能用,你学的并不是 shell 而是 sed 程序和 awk 程序;
最后,正则语言相比 html 来说是有点 low 的,不一定能满足要求,想省心省力最好用 html parser。
brotherlegend
2018-02-11 11:16:34 +08:00
@abscon 批评的是,不过这样写我的 vps
都能直接运行就 ok 拉
brotherlegend
2018-02-11 11:17:18 +08:00
@feichao 谢谢
gpw1987
2018-02-15 11:58:06 +08:00
sed 取行,awk 取列

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

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

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

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

© 2021 V2EX