使用 grep 时屏幕上出现奇怪的符号?

Fre*_*edo 12 grep terminal pipe escape-characters

./trans ... 命令输出显示转义码

知道是什么原因造成的吗?在不使用 grep 的情况下,唯一显示的是 ISO 代码和空白空间。

使用的软件

命令: ./trans --id --input /path/to/txt | grep ISO | grep [a-z]

root@box /test # alias grep
alias grep='grep --color=auto'
root@box /test # type grep
grep is aliased to `grep --color=auto'
Run Code Online (Sandbox Code Playgroud)

正常输出:

带有可读文本和 URL 的 trans 命令输出

Mic*_*mer 28

屏幕截图似乎显示了控制文本渲染的受损ANSI 颜色代码。粗体/明亮文本由序列生成␛[1m,通常由您的终端解释而不是直接显示在屏幕上:它只会使下一位文本变亮。un grepped 输出的屏幕截图显示了每行标签和值之间的色差,因此原始输出正在使用它们。

看起来这个序列已经被你的 final 打破了grep,它与代码中的“m”匹配(因为它是一个字母[a-z])并试图用红色本身突出显示它。这留下了部分转义序列,您的终端无法处理。

转义字符是 U+001B,它是在未知字符框中呈现的十六进制数。显示的是转义符(框)、 a [、 a 1、红色m后跟预期的匹配文本“eng”,同样发生在最后的“22”(“正常颜色和强度”的数字代码)。


损坏的输出实际上是:

␛[1 ␛[31米␛[22米␛[22 ␛[31米␛[22米 

where␛[31m使文本␛[22m变为红色并将其变回白色,两者均由字符grep周围插入m到原始文本中。原来只是:

 ␛[1m英语␛[22m 

这只是明亮的“ eng”,然后切换回普通文本。

您可以通过将 final 更改grepgrep --color=always和管道输入来检查这一点hexdump,这将显示所有不可打印的字符以及由您的终端解释的字符。


您可以通过几种方式处理此问题。一种是grep暂时不使用您的别名:

./trans --id --input /path/to/txt | grep ISO | \grep [a-z]
Run Code Online (Sandbox Code Playgroud)

反斜杠暂时跳过别名grep直接运行。

另一种是从原始命令中去除ANSI代码,对此问题有一些建议:

./trans --id --input /path/to/txt | perl -pe 's/\e\[[\d;]*m//g' | grep ISO | grep [a-z]
Run Code Online (Sandbox Code Playgroud)

另一种选择是在最后添加一个无关的管道:

./trans --id --input /path/to/txt | grep ISO | grep [a-z] | cat
Run Code Online (Sandbox Code Playgroud)

因为 finalgrep的输出不是直接输出到 TTY,而是cat通过管道输出,所以它不会插入彩色突出显示。

也许最好的选择是让 Translate Shell 在它不是终端时首先停止在它自己的输出中使用终端控制序列。这将适当地涉及您向其作者提交的错误报告以及对 Translate Shellansi()功能的代码修复,但可以稍微增加一下:

TERM=dumb ./trans --id --input /path/to/txt | grep ISO | grep [a-z]
Run Code Online (Sandbox Code Playgroud)

这传递了dumbTranslate Shell 环境中的终端类型,它至少将其识别为不支持 ECMA-48 颜色。(遗憾的是,Translate Shell 不使用 terminfo,只是在自己的代码中硬连线了它理解的终端类型和它使用的控制序列。)