grepを使用しているときに画面上に奇妙な記号がありますか?


12

./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コマンド出力


画像を添付する代わりに、出力を貼り付けてください。他の人が貼り付けたコマンドを再利用して、同じコマンドをシステムで再現できるようにします。
かくし

9
@Thushiこの場合、欠落しているグリフ記号をここに貼り付けることができないため、スクリーンショットが適切です。
-Sparhawk

あなたがすることができ、編集コマンドのスクリーンショットでは、末尾なしで実行grep秒、との結果alias greptype grep
マイケルホーマー

回答:


28

スクリーンショットには、テキストのレンダリングを制御する、マングルされたANSIカラーコードが表示されます。太字/明るいテキストはシーケンス␛[1mで生成されます。これは通常、端末によって解釈され、画面に直接表示されません。次のテキストを明るくします。grepped出力のスクリーンショットは、各行のラベルと値の色の違いを示しているため、元の出力はそれらを使用しています。

そのシーケンスは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を使用せず、独自のコードで、理解する端末タイプと使用する制御シーケンスを単に配線します。)


うわー、私は自分でこれをデバッグすることはできませんし、このような場所がないので、ありがとう!
フリード

IMOの犯人は、単に数字ではなく、完全なSGRエスケープシーケンスを含む壊れた変数GREP_COLORまたはGREP_COLORS環境変数である可能性があります。
エグモント

うわー、非常に多くのソリューション。--color=no最終的なgrepに追加する(または適用するTERM=dumb)ことができます
アンヘル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.