在管道传输之前处理 ANSI 转义代码

在管道传输之前处理 ANSI 转义代码

我正在尝试将一个脚本(Mocha)的输出通过管道传输到另一个脚本。但是有一个问题:Mocha 会生成相当多的 ansi 转义字符来动态更新屏幕。这些字符也会通过管道发送。

有没有办法处理 ansi 序列,使得输出与屏幕的最终输出相同?我确实想保留颜色转义序列,但不想保留光标移动转义。

编辑:我现在有一个部分解决方案(仅适用于 Mocha):到目前为止,Mocha 的 spec 输出(我使用的那个)似乎只生成彩色转义字符和CSI 0G转义序列。CSI 0G转义字符意味着光标应该移回到行首。Mocha 使用它来完全覆盖一行。因此,您可以简单地创建一个 sed 正则表达式,它将删除一行中该转义序列之前的所有内容:sed 's/^.*\x1b\[0G//g'。不过,我仍在寻找完整的解决方案。

答案1

sed -e 's/\x1b\[[0-9?]\+[^m0-9?]//g'

应该删除所有不是“选择图形呈现”代码的转义代码 - 例如颜色,粗体,斜体。

编辑:如果您希望实际覆盖先前的文本,您还应该先使用您的sed 's/^.*\x1b\[0G//g'过滤器。否则,先前的文本和新文本都将被输出。如果您希望执行所有序列,以便输出与显示在终端仿真器中,您必须制作某种可以实际执行所有代码的后台终端仿真器,此时,这样的项目将会黯然失色ansifilter

答案2

现在这是一个古老的问题,但我认为答案应该是使用unbuffer与之打包的expect

apt get install expect

unbuffer [command] | less -r
unbuffer [command] > [file]
unbuffer [command] | tee [file]

相关内容