我正在尝试解析 HTML 文件的内容以抓取下载目录,但是我已将其修改为重现我的问题的 MWE:
sed -e 's|\(href\)|\1|' index.html
打印整个 index.html。我原本以为是我的表达式有问题,但这个非常基本的表达式证明这是错误的。
如果我删除或者在最后-e
添加,也会发生同样的情况。g
我已经有一段时间没用过 sed 了,我是不是做错了什么?sed 是否会混淆 html 文件中的字符?
答案1
您应该使用grep
在文件中查找文本
sed
来更好地进行文本替换
如果您想列出超文本链接,您可以像这样简单地 grep 该文件:
grep -Po '(?<=href=")[^"]*' index.html
答案2
sed
您已将声音解释为与命令 ubstitution 一起使用的正常行为s
。我想您正在寻找类似这样的内容:
sed -nr 's/^.*href="(http.*)".*$/\1/p' index.html
在哪里:
/
在这种情况下用作分隔符(您可以使用|
或#
等)。选项
-n
(--quiet
,--silent
)抑制模式空间的自动打印,并且与此选项一起,我们应该使用一些附加命令来告诉 sed 要打印什么。此附加命令是打印命令 p,添加到脚本末尾。如果 sed 未使用 -n 选项启动,则 p 命令将复制输入。
该选项
-r
启用扩展正则表达式。如果没有这个选项,我们的命令可能是:sed -n 's/^.*href="\(http.*\)".*$/\1/p' index.html
该命令的
s
意思是替代:#<string-or-regexp>#<replacement>#
。^
将匹配到行首。$
将匹配到行尾。在 中,捕获组
(http.*)
将被视为变量\1
。
使用示例:
$ cat index.html
<!DOCTYPE html>
<html><head><title>Page Title</title></head><body>
<h1>My First Heading</h1>
<p>My first paragraph.</p>
<a href="https://www.w3schools.com">Visit W3Schools</a>
</body></html>
$ sed -nr 's/^.*href="(http.*)".*$/\1/p' index.html
https://www.w3schools.com
更多示例:
答案3
这可能过于麻烦,但我认为它对你来说是有用的,只要你的 href 内容不包含空格。
grep "href" index.html |tr ' ' '\n'|grep "^href" |cut -f2 -d'='
第一个命令grep
仅挑选出包含 href 的行。tr
将空格转换为换行符。第二个grep
命令仅抓取您感兴趣的 href 部分。最后,抓取cut
“ href=
”之后的所有内容。