保存被终端转义后的文本
问题起因
我的某个程序会自己打印 \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的时候只后退一个字节,并不知道某个字符串是原先的空格。
其他:
col默认缓冲 128 行,用stdbuf来调整是没用的,要用-l选项。- ANSI 颜色转义还得再处理。