我有一个文件(来自使用script
的终端会话记录),其中包含一堆转义序列(ANSI颜色和退格等等),终端在使用{{1}显示此文件时解释该转义序列} 例如。但是,如果我使用
cat
转义序列不会被解释/删除,并且会按原样写入新文件。这不仅适用于猫,事实上我发现不可能摆脱那些逃脱序列。我想清理文件并仅保留打印字符(包括空格和换行符),以便其他终端或程序上的某人可以在没有兼容性问题的情况下查看它。
关于此,还有许多其他主题,所以我将详细说明为什么我对这些问题的答案不满意:
人们建议使用cat myFile > newfile
或类似的一些或多或少(更多)复杂的正则表达式来删除转义序列。不是毫无疑问,这些线程充满了注释,显示了这些表达式中断的示例。因此,除非您能够证明您的正则表达式完全重新实现了macOS终端转义序列的解释/删除,否则这不是我感兴趣的解决方案类型。还有其他线程。
从终端窗口复制粘贴当然也是一种选择,但我已经知道了。
在cat(或echo或printf)之间的某个地方出现在屏幕上,这些转义序列被解释。是否可以在该点之后拦截它们并将它们打印到文件中?
令人讨厌的是,当在屏幕上打印的文件中很容易获得我想要的文字时,没有直接/简单的方法。
最后,代码示例,以便您可以复制:
sed
文件:
cat
注意:从终端复制文本时,不保留原始颜色。我有一个彩色的命令提示符(参见下面的转义序列)。
使用[anton@rain test]$ cat session.log
Script started on Thu Jun 14 18:06:38 2018
[anton@rain test]$ echo 'okay, now it seems to be working'
okay, now it seems to be working
[anton@rain test]$
[anton@rain test]$ exit
exit
Script done on Thu Jun 14 18:06:59 2018
查看文件:
less
注意:当我从此帖子复制粘贴回终端时,该文件的工作方式与以前不同。运行Script started on Thu Jun 14 18:06:38 2018
ESC]0;anton@rain:/MD/home/anton/tests/test^GESC[?1034hESC[00;35m[anton@rain test]$ ESC[00;30m^G^Gecho 'okay, now it seems to be working'
okay, now it seems to be working
ESC]0;anton@rain:/MD/home/anton/tests/test^GESC[00;35m[anton@rain test]$ ESC[00;30mESC[K
ESC]0;anton@rain:/MD/home/anton/tests/test^GESC[00;35m[anton@rain test]$ ESC[00;30mexit
exit
Script done on Thu Jun 14 18:06:59 2018
自己复制可能会更好。