在重定向输出中应用转义字符

在重定向输出中应用转义字符

我正在运行一个程序,该程序打印大量转义字符(例如“Esc[1A”,将光标向上移动一行),并尝试将输出重定向到日志文件。当我在没有重定向的情况下运行程序时,最终输出如下所示:

256 lines processed.

但是当我重定向到日志文件时,该文件最终看起来像这样:

Processing line 1...
Esc[1AProcessing line 2...
Esc[1AProcessing line 3...
...
Esc[1AProcessing line 256...
Esc[1A256 lines processed.

发生的情况是,在终端上,“Esc[1A”字符告诉光标后退,这样每个连续的行都会覆盖最后一行,最后只显示最后一行。

我希望日志文件的显示与程序的最终输出完全相同,无需重定向。我知道可以通过管道传输输出以col -bp过滤掉转义字符,但我实际上想申请以便我的日志文件最终不会包含数千个无关的行。我怎样才能实现这个目标?

答案1

您必须在阅读时清除这些转义符 - 执行终端所做的操作并覆盖它们。

这模拟了您描述的输出seq

seq -s "
$(printf '\033[A')" 10

如果它写入解释该转义的终端,它将看起来仅打印10。但正如您在问题中指出的那样,它实际上是在逐个打印所有这些数字。但是,如果我用sed以下方法过滤其输出:

seq -s "
$(printf '\033[A')" 10 |
sed -e :n -e "\$!N;s/.*$(printf '\033\[A')//;tn"

...它真的之所以打印只是10因为sed不断地读取下一行输入并s///替换掉从模式空间的头部到最后出现的所有内容按键逃脱。每次成功时,它都会分支回标签:nt再次尝试。

相关内容