sed 替换每行多个匹配项

sed 替换每行多个匹配项

我正在尝试替换一些 html 链接,以便它们在新选项卡中打开(指向同一页面的链接除外)。

这是一个虚拟 html 页面来说明我的问题。我称之为测试.html

<p>
This is the <a href="https://www.google.com/">Google link</a>
</p>

<p>
And these are <a href="https://twitter.com/">Twitter link</a> and <a href="https://www.instagram.com/">Instagram link</a>.
</p>

我正在使用此代码来查找链接并用一些附加内容替换链接。

sed -E 's/(<a href="[^#]+[-a-zA-Z0-9@:%._\+~#=/?&]+")(>)/\1 target="_blank">/g' test.html

结果如下:

<p>
This is the <a href="https://www.google.com/" target="_blank">Google link</a>
</p>

<p>
And these are <a href="https://twitter.com/">Twitter link</a> and <a href="https://www.instagram.com/" target="_blank">Instagram link</a>.
</p>

注意添加target="_blank".它按预期工作,除非存在多个匹配项。如果每行有多个匹配项,则仅替换最右边的一个。它似乎将整条线检测为一个块。

对此进行了一番研究,我发现了一个建议,即添加一个否定来分割检测块。所以我添加了一个否定来关闭标签>,所以^>代码看起来像

sed -E 's/(<a href="[^#]+[-a-zA-Z0-9@:%._\+~#=/?&^>]+")(>)/\1 target="_blank">/g' test.html

但这似乎并没有什么作用。也许,我做错了。

正在运行/测试sed 4.7。旨在运行于sed 4.4

答案1

该表达式[^#]+匹配从第一个 href 到第二个 href 结尾的所有内容。如果您想避免仅以开头的链接#,请删除+.

相关内容