保存被终端转义后的文本
问题起因
我的某个程序会自己打印 \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 颜色转义还得再处理。