sed处理大规模TSV文件时双引号清除残留原因及正则优化方法
残留双引号的核心原因
你之前配置的sed替换规则,仅能匹配字面序列"(也就是HTML格式的双引号转义实体,由&、q、u、o、t、;6个连续字符组成),从设计上就无法识别真实的ASCII半角双引号字符(U+0022,也就是会干扰TSV数据库导入的标准双引号)。
原来的命令能清理绝大多数内容,是因为文件里的大部分双引号本来就已经被转成了"这串固定文本,因此可以被规则命中。而未被清理的123行,本质是因为:
- 这些行里的双引号是未经过转义的原始半角
"字符 - 整行内容里根本不存在
"这串固定序列 - 原有规则自然无法匹配命中,最终成了漏网之鱼
这类问题行的共性是:文本导出时,内嵌的双引号没有被统一转义为HTML实体格式,而是以原始字符形式直接写入文件,和其他已经被转义为"的双引号属于两种不同的存储形态,因此会被原有规则遗漏。
调整后的处理命令
修改sed的正则规则,让它同时覆盖两种形态的双引号即可,调整后的批处理命令如下:
for FILE in *; do sed 's/"//g; s/"//g' "$FILE" > "/my/file/path/$FILE" done
规则优化点
- 保留原有
's/"//g'逻辑,继续清理所有HTML实体形式的双引号转义串 - 补充
's/"//g'匹配规则,直接清理原始的半角双引号字符,覆盖之前遗漏的场景 - 对文件名变量加双引号包裹,避免文件名包含空格、特殊字符时出现shell解析错误
- 移除了多余的
cat管道环节,减少不必要的进程开销
注意事项:确认输出路径
/my/file/path/和当前源文件目录不重叠,否则shell会在执行sed前先将输出文件截断为0字节,导致无法读取原文件内容。如果需要直接在原文件上修改,可以为sed添加-i参数(GNU sed可直接使用sed -i 's/"//g; s/"//g' "$FILE"实现原地修改)。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

