スクリーンショットには、テキストのレンダリングを制御する、マングルされたANSIカラーコードが表示されます。太字/明るいテキストはシーケンス␛[1m
で生成されます。これは通常、端末によって解釈され、画面に直接表示されません。次のテキストを明るくします。grep
ped出力のスクリーンショットは、各行のラベルと値の色の違いを示しているため、元の出力はそれらを使用しています。
そのシーケンスはgrep
、コード内の「m」と一致するfinalによって壊れており(文字であるため[a-z]
)、それ自体を赤で強調表示しようとしたようです。そのため、端末が処理できなかった部分的なエスケープシーケンスが残りました。
エスケープ文字␛
はU + 001Bです。これは、不明文字ボックスに表示される16進数です。表示されるのは、エスケープ(ボックス)、a [
、a 1
、赤のm
後に予想される一致テキスト「eng」、そして最後に「22」(「通常の色と強度」の数値コード)が続くことです。
壊れた出力は実際には:
␛[1 ␛[31メートルメン␛[22メートル ␛[22 ␛[31メートル M ␛[22メートル
ここで␛[31m
、テキストを赤にし、␛[22m
白に戻します。両方とも元のテキストに文字のgrep
周りに挿入されm
ます。オリジナルはただでした:
␛[1メートル ENG ␛[22メートル
これは単に明るい「eng
」で、その後通常のテキストに戻ります。
これを確認するには、final grep
を変更しgrep --color=always
てにパイピングします。これによりhexdump
、すべての印刷できない文字と端末によって解釈される文字が表示されます。
これにはいくつかの方法で対処できます。1つは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
最終的なgrep
出力はTTYに直接ではなくcat
、パイプを介して行われるため、色付きの強調表示は挿入されません。
おそらく最良のオプションは、端末への接続ではない場合、Translate Shellが独自の出力で端末制御シーケンスの使用を停止することです。これには、作成者へのバグレポートとTranslate Shellのansi()
機能のコード修正が適切に含まれますが、多少の問題を回避できます。
TERM=dumb ./trans --id --input /path/to/txt | grep ISO | grep [a-z]
これによりdumb
、少なくともECMA-48カラーサポートがないと認識されるTranslate Shellの環境で端末タイプが渡されます。(残念ながら、Translate Shellはterminfoを使用せず、独自のコードで、理解する端末タイプと使用する制御シーケンスを単に配線します。)