正如每天在 SO 上发布的那样:您无法使用正则表达式处理 HTML。您能否提供一些示例说明为什么使用正则表达式难以解析 XML 和 HTML?
对于像 sed 这样有限的工具,它的基本正则表达式是双倍的。
如果您的输入类型非常有限,以至于每个链接都采用完全相同的格式,则可能有可能,在这种情况下,您必须发布该格式的示例。但是对于一般的HTML页面,是做不到的。
ETA 给出了您的示例:在最简单的级别上,由于每个 URL 已经在其自己的行上,您可以选择看起来正确的那些并丢弃您不想要的位:
#!/bin/sed -f
s/^<td><a href="\(.*\)">.*<\/a><\/td>$/\1/p
d
但是请注意,这仍会使 URL 保留其 HTML 编码形式。如果生成此文件的脚本正确地对其 URL 进行 HTML 编码,则您必须将 lt/gt/quot/amp 实体引用的任何实例替换回它们的纯字符形式 '<>"&'。实际上您可能会遇到的唯一一个是 &/amp,这在 URL 中确实很常见。
但!这还不是所有可能发生的 HTML 编码。那里可能还有其他 HTML 实体引用,例如 eacute(现在我们有了 IRI,这将是有效的),或数字字符引用(十进制和十六进制)。包括 Unicode 在内的字符有 200 万多种潜在的编码形式……在 sed 中单独替换每个编码形式将是一项繁重的工作。
虽然如果您知道生成器脚本永远不会输出任何这些,您可能会侥幸逃脱,但 HTML 解析器仍然是最好的。(或者,如果您知道它是格式良好的 XHTML,您可以使用更简单的 XML 解析器,它往往内置于现代语言的标准库中。)