![sed 替换每行多个匹配项](https://linux22.com/image/190445/sed%20%E6%9B%BF%E6%8D%A2%E6%AF%8F%E8%A1%8C%E5%A4%9A%E4%B8%AA%E5%8C%B9%E9%85%8D%E9%A1%B9.png)
我正在尝试替换一些 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 结尾的所有内容。如果您想避免仅以开头的链接#
,请删除+
.