【问题标题】:BASH - How to use sed to pull out the URLS from a websiteBASH - 如何使用 sed 从网站中提取 URL
【发布时间】:2014-11-29 08:05:19
【问题描述】:

我有这个

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 去除所有额外内容并仅保留 html?

我的输出应该是这样的:

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

【问题讨论】:

  • 你已经用 sed 做了什么?

标签: linux bash shell unix sed


【解决方案1】:

sed 是一种脚本语言。您的命令看起来像您正在尝试使用带有以 ref=... 开头的选项的 h 命令(复制模式以保留空间),但 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?

【讨论】:

    猜你喜欢
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 2020-04-08
    • 2014-02-13
    • 2012-08-02
    相关资源
    最近更新 更多