如何批量移除文件中退格符(^H)及对应字符?
处理script会话输出中的退格符问题
方法1:Perl 批量处理
Perl 可以通过循环替换的方式,一次性清理所有退格符及对应的被删除字符,支持连续退格场景:
perl -pe '1 while s/[^\x08]\x08//' input.txt > output.txt
- 原理:
1 while会重复执行替换操作,直到文本中不再存在「非退格字符+退格符」的组合,彻底处理连续退格的情况(比如abcd^H^H^H会被处理成a)。
方法2:GNU Sed 循环替换
GNU Sed 支持标签跳转实现循环替换,适合直接修改原文件:
sed -i ':a; s/[^\x08]\x08//; ta' input.txt
- 解释:
:a定义循环标签,s/[^\x08]\x08//匹配并删除一组「非退格字符+退格符」,ta表示如果替换成功则回到标签a继续循环,直到没有可替换内容。
方法3:Awk 逐字符缓冲区处理
通过维护字符缓冲区模拟退格操作,逻辑更直观,适合复杂场景:
awk '{ buf = "" len = length($0) for (i=1; i<=len; i++) { c = substr($0, i, 1) if (c == "\x08") { if (length(buf) > 0) buf = substr(buf, 1, length(buf)-1) } else { buf = buf c } } print buf }' input.txt > output.txt
- 原理:逐个读取字符,遇到退格符就删除缓冲区最后一个字符,否则将字符加入缓冲区,最终输出清理后的内容。
内容的提问来源于stack exchange,提问作者Carl Ponder
相关产品推荐
相关产品推荐

