如何用正则仅定位<a href>与</a>标签间的">字符(sed/bash)
问题描述
我需要定位HTML标签间的特定内容:无需匹配从<a href到</a>的全部内容,仅需定位这两个标签之间的">字符。
我正尝试将<a href>链接转换为维基链接,例如示例文本:
<a href="./light.html">Light</a> is light. <div class="reasons">
希望直接编辑文件,将<a href="link.html">Link</a>转换为[[link.html|Link]]。目前我的思路是通过3步sed编辑实现:
<a href="link.html">Link</a>→<a href="link.html|Link</a><a href="link.html|Link</a>→[[link.html|Link</a><a href="link.html|Link</a>→[[link.html|Link]]
我的问题出在第一步:找不到仅定位<a href与</a>之间">的正则表达式。我明白需结合环视语法实现,但测试失败;也曾尝试条件正则,要么报错,要么会误匹配div标签。
补充说明:我使用Ubuntu系统,通过bash脚本调用sed进行文本处理。
解决方案
针对Ubuntu的GNU sed,以下是精准解决方法:
第一步的单步解决命令
用正向捕获匹配<a href标签内的">,替换为|,确保不匹配其他标签:
sed -E 's/(<a href="[^"]+)">/\1|/g' 你的文件名.html
解释:
(<a href="[^"]+)">:捕获<a href="xxx">部分,[^"]+确保只匹配到当前a标签的引号结束位置,不会越界\1|:保留捕获的内容,仅将后面的">替换为|
更高效的一步完成全部转换
没必要分三步,单行a标签可以用一条命令直接完成转换:
sed -E 's/<a href="([^"]+)">([^<]+)<\/a>/[[\1|\2]]/g' 你的文件名.html
解释:
([^"]+):捕获链接地址到分组1([^<]+):捕获链接文本到分组2(假设文本不含<字符)[[\1|\2]]:直接替换为维基链接格式
处理跨多行的a标签
如果存在跨多行的a标签,用sed的多行模式把整个文件读入内存处理:
sed -E ':a; N; $!ba; s/<a href="([^"]+)">([^<]+)<\/a>/[[\1|\2]]/g' 你的文件名.html
兼容带额外属性的a标签
如果a标签包含class等其他属性(如<a href="link.html" class="bar">Link</a>),调整正则兼容:
sed -E 's/<a[^>]+href="([^"]+)"[^>]*>([^<]+)<\/a>/[[\1|\2]]/g' 你的文件名.html
[^>]+会匹配a标签内的任意额外属性,确保不管标签结构如何都能正确捕获链接和文本。
内容的提问来源于stack exchange,提问作者TK Flagrante
相关产品推荐
相关产品推荐

