Freedo Asked: 2018-01-19 21:33:54 +0800 CST2018-01-19 21:33:54 +0800 CST 2018-01-19 21:33:54 +0800 CST 使用 grep 时屏幕上出现奇怪的符号? 772 知道是什么原因造成的吗?如果不使用 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' 正常输出: grep terminal 1 个回答 Voted Best Answer Michael Homer 2018-01-19T22:56:49+08:002018-01-19T22:56:49+08:00 屏幕截图似乎显示了损坏的ANSI 颜色代码,这些代码控制文本渲染。粗体/明亮的文本是由序列生成的␛[1m,通常由您的终端解释而不直接显示在屏幕上:它只是使下一个文本变亮。un grepped 输出的屏幕截图显示每行上的标签和值之间的颜色差异,因此原始输出正在使用它们。 看来该序列已被您的 final 打破grep,它与代码中的“m”匹配(因为它是一个 letter [a-z])并试图用红色突出显示它本身。这留下了部分转义序列,您的终端无法处理。 转义字符␛是 U+001B,它是在未知字符框中呈现的十六进制数字。显示的是转义符(框)、a [、a 1、a 红色,m后跟预期的匹配文本“eng”,以及在末尾出现的“22”(“正常颜色和强度”的数字代码)。 损坏的输出实际上是: ␛[1 ␛[31m萌␛[22m ␛[22 ␛[31m m ␛[22m where␛[31m使文本变为红色并将␛[22m其变回白色,两者都grep在字符周围插入m到原始文本中。原来只是: ␛[1m英␛ [22m 这只是明亮的“ eng”,然后切换回普通文本。 您可以通过将 final 更改grep为grep --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,只是在自己的代码中硬连线了它理解的终端类型和它使用的控制序列。)
屏幕截图似乎显示了损坏的ANSI 颜色代码,这些代码控制文本渲染。粗体/明亮的文本是由序列生成的
␛[1m
,通常由您的终端解释而不直接显示在屏幕上:它只是使下一个文本变亮。ungrep
ped 输出的屏幕截图显示每行上的标签和值之间的颜色差异,因此原始输出正在使用它们。看来该序列已被您的 final 打破
grep
,它与代码中的“m”匹配(因为它是一个 letter[a-z]
)并试图用红色突出显示它本身。这留下了部分转义序列,您的终端无法处理。转义字符
␛
是 U+001B,它是在未知字符框中呈现的十六进制数字。显示的是转义符(框)、a[
、a1
、a 红色,m
后跟预期的匹配文本“eng”,以及在末尾出现的“22”(“正常颜色和强度”的数字代码)。损坏的输出实际上是:
where
␛[31m
使文本变为红色并将␛[22m
其变回白色,两者都grep
在字符周围插入m
到原始文本中。原来只是:这只是明亮的“
eng
”,然后切换回普通文本。您可以通过将 final 更改
grep
为grep --color=always
并将管道更改为 来检查这一点hexdump
,这将显示所有不可打印的字符和终端解释的字符。你可以通过几种方式来处理这个问题。一种是
grep
暂时不使用别名:反斜杠暂时跳过别名
grep
直接运行。另一个是从原始命令中去除 ANSI 代码,对此问题有一些建议:
另一种选择是在末端添加一个无关的管道:
因为 final
grep
的输出不是直接到 TTY,而是cat
通过管道,所以它不会插入彩色突出显示。也许最好的选择是让 Translate Shell 停止在其自己的输出中使用终端控制序列,而不是终端。这将适当地涉及您向其作者提交的错误报告以及对 Translate Shell
ansi()
功能的代码修复,但人们可能会有些犹豫:这通过了
dumb
Translate Shell 环境中的终端类型,它至少识别为不支持 ECMA-48 颜色。(遗憾的是,Translate Shell 不使用 terminfo,只是在自己的代码中硬连线了它理解的终端类型和它使用的控制序列。)