为什么 grep 会根据终端宽度输出不同的结果?

Why does grep output a different result based on the terminal width?

this file 上执行命令 grep blackdetect 01.txt 时,我得到的输出取决于终端的宽度,这对我来说有点奇怪。

zshell 中宽度为 79 或更小的输出为:

frame= 1 fps=0.0 q=-0.0 size=N/A time=00:00:00.01 bitrate=N/A speed=0.671x frame= 358 fps=0.0 q=-0.0 size=N/A time=00:00:06.44 bitrate=N/A speed=12.2x [blackdetect @ 0x7fb809109300] black_start:6.7329 black_end:6.7689 black_duration:0.0360048

宽度为 80 时:

frame= 1 fps=0.0 q=-0.0 size=N/A time=00:00:00.01 bitrate=N/A speed=0.671x [blackdetect @ 0x7fb809109300] black_start:6.7329 black_end:6.7689 black_duration:0.0360048

宽度为 81 及以上时,它给出了我认为应该正确的结果:

[blackdetect @ 0x7fb809109300] black_start:6.7329 black_end:6.7689 black_duration:0.0360048

我对这个结果很困惑,这是怎么回事,我该如何解决? *.txt 文件由 运行 ffmpeg 创建并通过管道将 stderr 传输到文件。

系统详情: 硬件:MacBook Pro 2015 操作系统:macOS Big Sur(版本 11.5.2)(最新更新) 处理器:Intel Core i7,2.2GHz 四核

我怀疑您的输出包含 Carriage Return (CR) 字符(0x0D\r),它会将光标移动到行首而不前进到下一行线。这是终端中行的开头,而不是输出行的开头。从您的输出来看,[blackdetect @ 0x7fb80909300] 一词前面似乎有一个,但很可能还有更多。

您可以使用 cat -vET 将 CR 可视化,其中它将转换为 ^M 组合。

$ command | cat -vET`

您可以通过以下简单示例了解 CR 和终端宽度的效果:

$ a=$(printf "%s" {0..9})
$ echo $a$a$a$'\r'$a

终端宽度为 23,输出如下:

012345678901234567890123
0123456789

你清楚地看到第二行缺少字符 456789

相关: How to replace carriage return without new line in FFmpeg output thanks to sed?