知道是什么原因造成的吗?如果不使用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,则唯一显示的内容是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'
正常输出:
Answers:
该屏幕快照似乎显示了损坏的ANSI颜色代码,该颜色代码控制文本的呈现。粗体/粗体文本是使用sequence生成的␛[1m
,通常由终端解释该序列,而不是直接在屏幕上显示:它只是使下一行文本变亮。un grep
ped输出的屏幕快照显示标签和每行上的值之间的颜色差异,因此原始输出正在使用它们。
看来该序列已被您的final破坏,该序列grep
与代码中的“ m”匹配(因为它是一个字母[a-z]
),并尝试用红色本身突出显示。这留下了部分转义序列,您的终端无法处理。
转义字符␛
为U + 001B,这是在未知字符框中呈现的十六进制数字。显示的是转义符(方框),a [
,a 1
,红色,m
后跟预期的匹配文本“ eng”,并且在结尾处也出现“ 22”(“正常颜色和强度”的数字代码)。
损坏的输出实际上是:
␛[1 ␛[31米孟␛[22米 ␛[22 ␛[31米米␛[22米
其中␛[31m
使文字␛[22m
变成红色,然后又变回白色,两者都grep
在m
字符周围插入了原始文字。原来是:
␛[1分主机␛[22米
只是明亮的“ 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
由于final grep
的输出不是直接输出到TTY,而是cat
通过管道输出,因此不会插入彩色突出显示。
也许最好的选择是让Translate Shell在不连接终端时首先停止在其自己的输出中使用终端控制序列。那将适当地涉及到您向其作者的错误报告,以及对Translate Shell ansi()
功能的代码修复,但您可以对此稍作改动:
TERM=dumb ./trans --id --input /path/to/txt | grep ISO | grep [a-z]
这可以通过dumb
Translate Shell环境中的终端类型,至少可以识别为不支持ECMA-48颜色。(遗憾的是,Translate Shell并没有使用terminfo,而只是在其自己的代码中硬接线了它能够理解的终端类型以及所使用的控制顺序。)
GREP_COLOR
或GREP_COLORS
环境变量,其中包含完整的SGR转义序列,而不仅仅是数字。
--color=no
到最终的grep(或应用TERM=dumb
到它)