BASH - 如何使用sed从网站中提取URLS

时间:2014-11-28 20:01:09

标签: linux bash shell unix sed

我有这个

exec 5<>/dev/tcp/twitter.ca/80
echo -e "GET / HTTP/1.0\n" >&5
cat <&5 

我看了一个类似的剧本

curl http://cookpad.com 2>&1 | grep -o -E 'href="([^"#]+)"' | cut -d'"' -f2

但我只需要使用sed命令。

我得到的输出是这个

sed: -e expression #1, char 2: extra characters after command


#!/bin/bash

exec 5<>/dev/tcp/twitter.ca/80
echo -e "GET / HTTP/1.0\n" >&5
cat <&5 | sed -r -e 'href="([^"#]+)"'

我现在拥有的是什么,我想我想要做的是如何使用sed去除所有额外内容并将其保留在htmls中?

我的输出应该是这样的:

href="UnixFortune.apk"
href="UnixFortune-1.0.tgz"
href="BeagleCar.apk"
href="BeagleCar.zip"

1 个答案:

答案 0 :(得分:0)

sed是一种脚本语言。您的命令看起来像是尝试使用h命令(复制模式来保存空间),其中包含以ref=开头的选项...但h命令不能执行任何操作选项。

无论如何,你想要的命令是s命令,它执行替换。也就是说,您希望在匹配组之前和之后替换所有内容(因此只打印捕获的组)。

sed -r -e 's/.*href="([^"#]+)".*/\1/'

但是,如果某一行上有多个匹配项(或没有匹配项的行,尽管使用sed -n 's/.../p'很容易修复),这仍然无法做正确的事情。您当然可以在sed中解决这个问题,但我建议您改为grep -o,除非您特别想学习,编写和维护sed脚本。 (或者,重写为Awk或Perl脚本。特别是Perl对此类任务有更多的杠杆作用。)

当然,对于这个特定任务,正确的工具是HTML解析器。没有办法正确地使用正则表达式来分离HTML。参见例如How to extract links from a webpage using lxml, XPath and Python?