我可以使用unix utils以编程方式“烧入”ANSI控制代码到文件吗?

时间:2015-02-01 23:41:14

标签: linux awk sed cat

示例:我开始使用script进行录制,并尝试键入echo test但省略o,因此我退格以更正它。

当我cat typescript一切正常时,由于代码被解释,但如果我使用lessvim,我会看到ech test^H^[[K^H^[[K^H^[[K^H^[[K^H^[[Ko test^M

我完全理解这是什么以及它为什么会发生,但有没有办法“烧掉”代码并只在文件中看到结果?我的kludgy方法是cat文件,然后将文本复制/粘贴到终端之外,但肯定有一些cat,sed,awk或其他东西的组合可以让我更容易到达那里吗?

2 个答案:

答案 0 :(得分:3)

显示包含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。)

  • `:再次; S / [^ \ X08] \ X08 \ X1B [K //;再次

    这将删除任何退格序列。这些是在循环中一次完成的。

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

    作为xterm扩展程序(请参阅documentation),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'

答案 1 :(得分:3)

建议的答案使用" sed -r"依赖于GNU sed,这使它不具备可移植性。可以使用POSIX sed执行相同的功能,但不同:POSIX不提供在命令选项中传递整个脚本,如此处所示。这意味着实现循环的(POSIX)方式将在一个单独的文件中,使用" -f"传递给sed。选项。同样,十六进制常量也不可移植。进行这些更改后,可以在BSD和Unix系统上使用功能相同的脚本。

建议的答案也没有涵盖一些相当常见的回车用途(例如在yum输出中),也没有过滤掉#34;大多数" ANSI序列(因为它专注于SGR" m"最终字符)。最后,它指的是

escape _ text _

作为xterm扩展。但是xterm没有提供这样的扩展,因为这两个字符" escape"和" _"开始Application Program Command 序列(并且xterm实现none)。

生成的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

一个更完整的脚本,名为&#34; script2log&#34;可以找到here。但是,有些东西(例如CSI K)不适合sed脚本。