保存被终端转义后的文本

问题起因

我的某个程序会自己打印 \r\b 字符以在终端上起到提示效果,但是如果将内容重定向到文件,那么显示出来效果就不好。在很多阅读器中特殊字符不能被正确显示,在 VS Code 中 \r 会换行,而 \b 也不会真正起到删除的作用。

方法 1:cat 或者 less -r

假设现在文件 A.log 中包含了大量 \r\b,想要阅读它可以直接将其 cat 到终端,或者使用 less -r A.log 来阅读。less -r 是比较推荐的,因为还能用 / 查找、用 & 过滤

方法 2:col

如果想要真正保存一份和我们在终端看上去一样的文件,可以使用:

col -b < A.log > A1.log

这样 A1.log 中保存的文本就和我们在终端看上去的一样。不过,col 输出的结果看起来和终端里面还是有一点差异,比如 backspace 后面接一个 space 就没有把该覆盖的东西覆盖,只会把光标向前移动一格!

失败的尝试:

  • 尝试先把空格都替换成 col 手册中没有的特殊字符,然后用 col 处理完成之后再替换回来:特殊字符可能被舍弃或者没有正常处理,在 col 处理完成之后还原不了。
  • 尝试把空格替换成文中没有出现过的字符串:每一行末尾的可能会残留字符串,因为 col 在解释 \b 的时候只后退一个字节,并不知道某个字符串是原先的空格。

其他:

  1. col 默认缓冲 128 行,用 stdbuf 来调整是没用的,要用 -l 选项。
  2. ANSI 颜色转义还得再处理。