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

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

./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'

正常输出:

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

答案1

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

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

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


损坏的输出实际上是:

␛[1␛[31m␛[22m␛[22␛[31m␛[22m 

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]

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

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

./trans --id --input /path/to/txt | perl -pe 's/\e\[[\d;]*m//g' | grep ISO | grep [a-z]

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

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

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

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

TERM=dumb ./trans --id --input /path/to/txt | grep ISO | grep [a-z]

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

相关内容