从结果集中删除属性名称?

从结果集中删除属性名称?

我有一个 HTML 文档(过于简化时)如下所示:

<html>
  <body>
    <a href="...">...</a>
    <a href="...">...</a>
    <a href="...">...</a>
    ...
  </body>
</html>

我想要做的是提取行分隔输出中的 URL。输入 xmllint:

$ xmllint --html --xpath //a/@href
href="..." href="..." href="..."

它获取属性,包括名称的整个属性,并以空格分隔输出它们。如何获取包含属性值的行列表href?我想要这样的输出:

...
...
...

其中是在每个元素的属性...中找到的 URL 。hrefa

如何正确格式化此输出?

答案1

鉴于file.html

<html>
  <body>
    <a href="url1">link text 1</a>
    <a href="url2">link text 2</a>
    <a href="url3">link text 3</a>
    ...
  </body>
</html>

我们可以使用 Unix 管道发送现有的xmllint输出,sed并查看以下结果:

$ xmllint --html --xpath //a/@href input.html | sed 's/ href="\([^"]*\)"/\1\n/g'
url1
url2
url3

解释

单独使用xmllint,我们只能得到:

$ xmllint --html --xpath //a/@href input.html
 href="url1" href="url2" href="url3"%
  • 尾随%表示没有尾随换行符

类 Unix 系统的好处之一是我们可以受益于道格·麦克罗伊的烟斗功能,所以我们不必让一个程序尝试做所有事情,事实上我们鼓励组合程序来满足我们的需求。

因此,发现xmllint的输出不令人满意,我们通过管道将其与我们的sed命令结合起来,其中:

  • 搜索href="URL"单位
  • 使用\( \)分组包围 URL 部分
  • 并将其替换为,\1\n以便它引用我们在 URL 周围定义的组,同时还在匹配的后面添加一个新行\1

通过这种方式,我们组合xmllintsed以获得所需的行分隔输出,每行一个 URL。

答案2

您是否考虑过使用 sed:

sed -n 's/.*href="\([^"]*\).*/\1/p'

相关内容