【发布时间】:2021-12-02 05:27:46
【问题描述】:
我有很多 HTML 文件,其中包含很多不同的内容,我总是使用名为 pup 的命令行工具提取其中的特定部分。摘录有时包含如下所示的标签:
<a href="https://www.stackoverflow.com" class="someclasses">anchor text</a>
...或者像这样:
<a class="someclasses" href="https://www.duckduckgo.com" target="_blank" js-class>
Visit Duck Duck Go!
</a>
...甚至像这样:
<a class="someclasses"
href="mailto:this.is.an@email.com" js-class>
email
</a>
我想做的是……
- ...提取href值和锚文本(
<a ...>和</a>之间的文本)。 - ... 将两个摘录放在单独的行中,但顺序相反:首先是文本,然后是 href 值。
- ... 在每个 href 值前面放置三个字符:
=>
所以结果看起来像这样:
Visit Duck Duck Go!
=> https://www.duckduckgo.com
如果一切都在一行中,我可以通过创建组/模式并切换它们的打印顺序,通过一些连接的sed 命令和一些正则表达式来获得我想要的东西,就像在第一个示例中一样。但是如果锚标签分布在多行上,我不知道如何获得我想要的东西。我试图只用sed 来实现我的目标,但我没有运气。昨天我一直在阅读其他人的类似问题,并且 sed 不适合在换行符之外工作。这是真的? awk 可以这样做吗?我可以使用其他工具吗?
【问题讨论】:
-
Don't Parse XML/HTML With Regex. 我建议使用 XML/HTML 解析器 (xmlstarlet, xmllint ...)。
-
我感觉 pup 应该能够做到这一点,如果没有,你总是可以使用 pup 转换为 JSON,然后使用 jq 之类的东西来稳健地提取它。