我有这个
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/