You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UNIX Shell中替换</a>与下一个<a>标签间所有内容的脚本实现问题

首先得说,用正则处理HTML确实容易踩坑——HTML的结构太灵活了,跨行、嵌套、属性顺序变化都能让正则失效,不过先帮你把当前的脚本问题解决,再给你更靠谱的方案。

你的现有脚本问题分析

你当前的sed命令偶尔生效,主要原因有两个:

  1. sed默认逐行处理:如果</a>和下一个<a>不在同一行,sed根本匹配不到这一对;
  2. grep正则有语法错误:开头的*是无效的正则量词,应该用.*,而且[[:print:]]会匹配很多无关字符,导致grep过滤出来的内容不准确。

方案一:用专业HTML解析工具(推荐)

正则处理HTML是权宜之计,更可靠的是用专门的HTML解析器,比如pup(轻量的命令行HTML解析工具)。

步骤:

  1. 先安装pup(Ubuntu/Debian系统可以直接装):
sudo apt install pup
  1. 修改你的脚本:
#!/bin/sh
# 提取所有带href的<a>标签,用REPLACED分隔
wget -qO - "$1" | pup 'a[href]' | sed 's/$/REPLACED/' | tr -d '\n' | sed 's/REPLACED$//'

解释:

方案二:改进sed/grep文本处理(适合简单场景)

如果不想装新工具,我们可以先把所有HTML内容合并成一行,再用sed精准替换</a>到下一个<a[href]>之间的内容:

#!/bin/sh
wget -qO - "$1" | 
# 先把所有换行去掉,避免跨行匹配问题
tr -d '\n' | 
# 匹配</a>到下一个带href的<a>之间的内容,替换为REPLACED
sed -E 's/<\/a>[^<]*<a([^>]+href[^>]+)>/<\/a>REPLACED<a\1>/g' | 
# 过滤出所有完整的带href的<a>标签(可选,确保只保留目标内容)
grep -oE '<a[^>]+href[^>]*>.*?<\/a>' | 
# 用REPLACED连接所有标签
paste -sd 'REPLACED' -

解释:

注意事项

用正则处理HTML永远有局限性:比如注释里的<a>字符串、脚本/样式中的<a>文本、不规范的HTML标签(比如大写/混合大小写、属性不带引号)都可能导致误匹配。如果是长期或复杂的HTML处理需求,更推荐用Python的BeautifulSoup这类库,或者前面提到的pup工具,能避免很多坑。

内容的提问来源于stack exchange,提问作者Vytenis Kajackas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 14:02:36