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

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

我的输出应该是这样的:

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

最佳答案

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?

关于linux - BASH - 如何使用 sed 从网站中提取 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27195221/

相关文章:

linux - 菜单和子菜单,然后返回到Linux上的菜单脚本

bash - 将文本从先前的标准输出拉到命令行上

c++ - ncurses A_ALTCHARSET 字符未在 OSX 上显示

c++ - OpenProcess/ReadProcessMemory/WriteProcessMemory/CloseHandle 等效项

linux - 获取运行目录名的方法

excel - 如何使用腻子将多个命令传递给 VBA 中的 Shell 函数?

oracle - 将 sqlplus 值传递给 shell 变量

c - OpenWrt LibUbi 实现

linux - Swift - 读取管道输入

Linux Yum 致命 Python 错误 : pycurl: libcurl link-time version is older than compile-time version