如何用sed移除HTML文件中href含todaycycling.com/tag的锚点标签
问题场景
你需要移除HTML文件里所有href属性包含todaycycling.com/tag的<a>标签,仅保留标签内的文本,其他<a>标签保持原样。
原始HTML内容:
Un Allemand peut en cacher un autre. Après Marcel Kittel, c'est André Greipel qui a imposé sa pointe de vitesse à l'issue de la cinquième étape du Tour d'Italie. Dans une arrivée en faux plat montant, le sprinteur de la formation Lotto Soudal a produit un intense effort pour aller chercher la victoire devant Arnaud Démare (FDJ), encore deuxième, et Sonny Colbrelli (Bardiani-CSF).
期望输出:
Un Allemand peut en cacher un autre. Après Marcel Kittel, c'est André Greipel qui a imposé sa pointe de vitesse à l'issue de la cinquième étape du Tour d'Italie. Dans une arrivée en faux plat montant, le sprinteur de la formation Lotto Soudal a produit un intense effort pour aller chercher la victoire devant Arnaud Démare (FDJ), encore deuxième, et Sonny Colbrelli (Bardiani-CSF).
分析现有尝试的sed命令
你试的这个命令思路是对的,但有个小局限:
sed 's|<a [^>]*todaycycling\.com\/tag\/[^>]*>\([^>]*\)</a>|\1|Ig' old.html > new.html
捕获组里的[^>]*会匹配到第一个>就停止,如果锚点文本里意外出现>(虽然这个场景概率极低),就会截断内容。另外,对href属性的引号兼容性处理不够灵活。
优化后的sed命令
针对你的需求,我调整了正则,让它更健壮:
sed -E 's|<a[^>]+href="?[^"]*todaycycling\.com/tag/[^"]*"?[^>]*>([^<]*)</a>|\1|Ig' old.html > new.html
这个命令的改进点:
- 用
[^>]+更精准匹配锚点标签开头的属性段,兼容标签内的空格和其他属性 - 支持
href属性带双引号或不带引号的情况 - 用
[^<]*捕获标签内文本,因为锚点结束标签是</a>,文本里不会出现<,比[^>]*更安全
运行这个命令后,就能完美得到你想要的结果——只清理目标锚点,保留其他正常链接和文本。
内容的提问来源于stack exchange,提问作者Alexsoyes

