我能否使用Unix工具在程序中“烧录”ANSI控制码到文件中?

9
例子:我使用script开始录制,并尝试输入echo test但省略了字母o,所以我用退格键进行更正。

当我使用cat typescript查看时,一切看起来都很正常,因为代码被解释了,但如果我使用lessvim,我会看到ech test^H^[[K^H^[[K^H^[[K^H^[[K^H^[[Ko test^M

我完全理解这是什么以及为什么会发生,但是否有任何方法可以“烧入”代码并只在文件中看到结果?我的笨拙方法是先通过cat命令查看文件,然后将文本从终端复制/粘贴出来,但肯定有一些组合使用catsedawk或其他工具的方法可以更轻松地实现,对此我不太确定。


请尝试使用 less -r typescriptless -R typescript - John1024
哦,太酷了,我不知道-r这个选项。有没有办法将其保存到文件中?less -r typescript > newfile没有起作用。 - Joe Fruchey
看起来是一个重复的问题,与这个stackexchange问题相似。我最喜欢最后一个。 - rodrigo
Joe,我刚刚添加了一个答案,其中包含一个 sed 命令,应该可以删除大部分这些序列。 - John1024
@John1024:恐怕对于这个问题,less -r/-R也不会比普通的cat更好。 - rodrigo
显示剩余3条评论
2个回答

6
为了显示包含ANSI序列的文件,
less -r typescript

或者,

less -R typescript

要从文件中删除ANSI和退格符序列,创建一个干净的newfile,请尝试以下操作:

sed -r ':again; s/[^\x08]\x08\x1b\[K//; t again; s/\x1b_[^\x1b]*\x1b[\]//g; s/\x1B\[[^m]*m//g' typescript >newfile

工作原理

  • -r

    这会开启扩展正则表达式。(在 BSD 系统上,-r 应该被替换为 -E。GNU sed 的现代版本将接受 -r-E)。

  • `:again; s/[^\x08]\x08\x1b[K//; t again

    这会去除任何退格符号序列。这些序列会在一个循环中一个一个地执行。

  • s/\x1b_[^\x1b]*\x1b[\]//g

    作为一个 xterm 扩展(请参阅文档),Esc _ something Esc \ 什么也不会做。此命令会删除这些序列。

  • s/\x1B\[[^m]*m//g

    这会删除设置颜色等的剩余 ANSI 序列。

这涵盖了我通常遇到的所有控制序列。有各种各样的扩展控制序列,如果你的输出包含我没有见过的序列,则可能需要扩展代码。

POSIX 或 BSD 的 sed

在 BSD 或 POSIX 系统上,必须使用 -e 选项将各个命令链接在一起,而不是使用分号。因此,请尝试:

sed -e ':again' -e 's/[^\x08]\x08\x1b\[K//' -e 't again' -e 's/\x1b_[^\x1b]*\x1b[\]//g' -e 's/\x1B\[[^m]*m//g'

3
建议使用“sed -r”来实现相同的功能,但是这种方法依赖于GNU sed,因此不太具有可移植性。使用POSIX sed也可以实现相同的功能,但是方式不同:POSIX不支持像这里展示的在命令选项中传递整个脚本。这意味着(POSIX)实现循环的方法是在一个单独的文件中,并使用“-f”选项将其传递给sed。同样,十六进制常量也不具备可移植性。经过这些更改后,可以在BSD和Unix系统上使用等效的脚本。

建议的答案还没有涵盖一些常见的回车符用法(例如yum输出),也没有过滤掉“大多数”ANSI序列(因为它专注于SGR“m”最终字符)。最后,它提到了

escape _ text _

作为xterm的扩展功能。但是,由于两个字符“escape”和“_”开始应用程序命令序列(而xterm没有实现任何),因此xterm没有提供这样的扩展功能。
生成的sed脚本如下所示(“^ [”是转义字符):
s/^[[[][<=>?]\{0,1\}[;0-9]*[@-~]//g
s/^[[]][^^[]*^G//g
s/^[[]][^^[]*^[\\//g
:loop
s/[^^H]^H\(.\)/\1/g
t loop
s/^M^M*$//g
s/^.*^M//g
s/^[[^[]//g

可以在这里找到一个更完整的脚本,名为“script2log”。然而,有些东西(比如CSI K)不适合用sed脚本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接