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画面に直接表示されません。テキストの次のビットを明るくします。 unped出力のスクリーンショットgrepを見ると、各行のラベルと値の間に色の違いがあり、元の出力ではそれを使用していることがわかります。

grepコードの「m」(文字なので[a-z])と一致し、赤で強調表示されるFinalによってシーケンスが中断されたようです。これにより、端末が処理できない部分エスケープシーケンスが残ります。

エスケープ文字はU + 001Bで、これは未知の文字ボックスに表示される16進数です。表示されるのは、エスケープ文字(ボックス)、a [、a 1、赤mの後に予想される一致テキスト「eng」です。最後の「22」(「通常の色と強度」の数値コード)でも同じことが起こります。


破損した出力は実際には次のとおりです。

␛[1␛[31分激しい␛[22分␛[22␛[31分␛[22分 

ここで␛[31mテキストを赤にし、␛[22m再び白に置き換えます。両方とも文字を囲み、元のテキストにgrep挿入されます。m元のテキストは次のとおりです。

 ␛[1分英語␛[22分 

これにより、 " eng"が明るくなり、プレーンテキストに戻ります。

grepFinalをに変更しgrep --color=alwaysてinputをパイピングしてこれを確認できます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

Finalgrepの出力はTTYに直接渡されず、パイプで接続されているため、catカラーハイライトを挿入しません。

おそらく最良の選択肢は、端末に接続されていない場合は、独自の出力でターミナル制御シーケンスを使用するTranslate Shellを最初に停止することです。これには、作成者に送信するバグレポートとansi()Translate Shell機能のコード修正が適切に含まれていますが、これを少し回避できます。

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

これは、dumb少なくともECMA-48色をサポートしていないと認識されるTranslate Shell環境の端末タイプを渡します。 (残念ながら、Translate Shellはterminfoを使用せず、単に自分が理解する端末の種類と使用する制御シーケンスを独自のコードに直接接続します。)

おすすめ記事