Sed使用锚文本替换指向特定域的链接

时间:2016-08-04 10:04:36

标签: html regex sed hyperlink

我有很多静态HTML文件,其中包含各种域的链接。

我只需要用锚文本替换特定域的所有链接。

这是迄今为止我设法提出的命令:

dropdownParent

以下是一个如何运作的例子:

sed 's|<a .*example\.com.*>\(.*\)<\/a>|\1|Ig' file.html

应该成为这个:

<p>Some random text <a href="http://example.com/sample_page" title="Example Title">Anchor Text</a> | Some other random text <a href="http://example.org/">Different Anchor Text</a></p>

当每行只有一个链接时,上面的命令很有效,但是如果有多个链接只删除了最后一个锚文本,则会删除所有这些链接。

我在这里找到了一些其他类似的主题,但无法针对我的问题调整任何解决方案。当然,完全有可能我可能已经错过了一个已经存在的主题,并且我没有尝试过解决方案。如果我没有清楚地解释问题,或者我错过了提供一些重要信息,请告诉我。

//编辑:

<p>Some random text Anchor Text | Some other random text <a href="http://example.org/">Different Anchor Text</a></p>替换.*后,命令如下:

[^>]*

第一个结束sed 's|<a .*example\.com[^>]*>\(.*\)<\/a>|\1|Ig' file.html仍然存在,并且已从最后一个中删除。

以下是一个示例结果:

</a>

<p>Some random text Anchor Text</a> | Some other random text <a href="http://example.org/">Different Anchor Text</p>替换.*会产生相同的结果。

1 个答案:

答案 0 :(得分:2)

您应该注意.匹配任何字符,它也匹配任何尖括号。

你可以&#34;脾气&#34;具有否定括号表达式.的{​​{1}}:

[^<]

这意味着sed 's|<a [^>]*example\.com[^>]*>\([^>]*\)</a>|\1|Ig' file.html 标记内不能有>。由于a可以出现在您正在处理的内容中,我认为更安全,但更慢一点的选择是使用>(因为[^<]应始终用作实体)