示例:我开始使用script
进行录制,并尝试键入echo test
但省略o,因此我退格以更正它。
当我cat typescript
一切正常时,由于代码被解释,但如果我使用less
或vim
,我会看到ech test^H^[[K^H^[[K^H^[[K^H^[[K^H^[[Ko test^M
我完全理解这是什么以及它为什么会发生,但有没有办法“烧掉”代码并只在文件中看到结果?我的kludgy方法是cat
文件,然后将文本复制/粘贴到终端之外,但肯定有一些cat,sed,awk或其他东西的组合可以让我更容易到达那里吗?
答案 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序列
这涵盖了我通常遇到的所有控制序列。有各种各样的扩展控制序列,如果你的输出有一些我看不到的,那么代码可能需要扩展。
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脚本。