我有这个
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"
答案 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?