重定向带有回车符的垃圾邮件终端的输出

jld*_*eon 4 bash io-redirection

我有一个命令可以创建非常详细的输出,大约每秒数百行。但是,该命令用于\r以类似于进度条的方式覆盖前一行输出。有时它会向终端写入换行符,这会“烘焙”当前的输出行。

当将此输出重定向到文件时,我得到数百兆的输出 - 每行都被写入文件,而不是在发生回车时被“覆盖”。

我知道这是预期的行为,解决这个问题的一种方法是使程序更智能,并意识到它被重定向到文件而不是打印此交互状态。但是,我无法修改这个程序。

有什么方法可以管道/过滤此输出,以便最终输出文件中的内容与在终端上交互式运行它时看到的内容相同?

我试过了:

spammy_cr_command | uniq

...其输出与没有相同uniq

并且:

spammy_cr_command | sed '/\r/d'

...这也删除了包含换行符的“烘焙”行。

Mic*_*mer 6

cmd | sed -e 's/.*\r//' > file
Run Code Online (Sandbox Code Playgroud)

这会将每行上回车后的所有文本替换为空,只留下最后回车之后的部分行。不过,这不一定与终端上留下的内容相同,但大多数时候它是一个接近的近似值。


特别是,不处理行比其后继行长的情况。该程序会给出不正确的结果:

printf 'abcdefg\rxyz\n'
printf '123456789\r\nxyz\n'
Run Code Online (Sandbox Code Playgroud)

因为明显留下的是

xyzdefg
123456789
xyz
Run Code Online (Sandbox Code Playgroud)

sed也会跳过所有未删除的字符并给出

xyz

xyz
Run Code Online (Sandbox Code Playgroud)

您可以确定您的程序是否有这样的行为。进度条等将光标停留在左侧边缘的情况并不罕见,这可能不会给出您想要的结果。