Sed 正在转储整个文件

Sed 正在转储整个文件

我正在尝试解析 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 部分。最后,抓取cuthref=”之后的所有内容。

相关内容