原因は何か知っていますか? 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'
一般出力:
ベストアンサー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
"が明るくなり、プレーンテキストに戻ります。
grep
Finalをに変更し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を使用せず、単に自分が理解する端末の種類と使用する制御シーケンスを独自のコードに直接接続します。)