Grep

使用 grep 時螢幕上出現奇怪的符號?

  • January 26, 2018

./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 命令輸出

螢幕截圖似乎顯示了損壞的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 更改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,只是在自己的程式碼中硬連線了它理解的終端類型和它使用的控制序列。)

引用自:https://unix.stackexchange.com/questions/418157