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

Joe*_*hey 6 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或其他东西的组合可以让我更容易?

Joh*_*024 6

要显示包含 ANSI 序列的文件,

less -r typescript
Run Code Online (Sandbox Code Playgroud)

或者,

less -R typescript
Run Code Online (Sandbox Code Playgroud)

要从文件中删除 ANSI 和退格序列,创建一个 clean newfile,请尝试:

sed -r ':again; s/[^\x08]\x08\x1b\[K//; t again; s/\x1b_[^\x1b]*\x1b[\]//g; s/\x1B\[[^m]*m//g' typescript >newfile
Run Code Online (Sandbox Code Playgroud)

怎么运行的

  • -r

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

  • `:再次;s/[^\x08]\x08\x1b[K//; 再次

    这会删除所有退格序列。这些都是在循环中一次完成一个。

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

    作为xterm扩展(请参阅文档),Esc _ something Esc \不会执行任何操作。此命令删除这些序列。

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

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

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

POSIX 或 BSDsed

在 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'
Run Code Online (Sandbox Code Playgroud)