リダイレクトされた出力にエスケープ文字を適用する

リダイレクトされた出力にエスケープ文字を適用する

多くのエスケープ文字(カーソルを1行上に移動させる「Esc [1A」)を印刷し、出力をログファイルにリダイレクトするプログラムを実行しています。リダイレクトなしでプログラムを実行すると、最終出力は次のようになります。

256 lines processed.

ただし、ログファイルにリダイレクトすると、ファイルは次のように表示されます。

Processing line 1...
Esc[1AProcessing line 2...
Esc[1AProcessing line 3...
...
Esc[1AProcessing line 256...
Esc[1A256 lines processed.

ターミナルでは、「Esc [1A」文字はカーソルに戻り、各連続行が最後の行を上書きして最後の行のみを表示するように指示します。

リダイレクトせずに、ログファイルがプログラムの最終出力と同じように表示されるようにします。エスケープされた文字をフィルタリングするために出力をパイプすることは可能ですが、col -bp実際には適用する私のログファイルが無関係な数千行で終わらないようにします。この目標をどのように達成できますか?

答え1

読むときにこれらのエスケープ文字を消去する必要があります。端末が実行する操作を実行して上書きします。

これは説明する出力をシミュレートしますseq

seq -s "
$(printf '\033[A')" 10

エスケープを解釈する端末に書き込む場合にのみ印刷されるように見えます10。しかし、あなたの質問で指摘したように、実際にはこれらすべての数字を1つずつ印刷しています。ただし、sed出力を次のようにフィルタリングすると:

seq -s "
$(printf '\033[A')" 10 |
sed -e :n -e "\$!N;s/.*$(printf '\033\[A')//;tn"

...それ本物印刷される理由は、10入力sedの次の行を読み続け、s///パターン空間の先頭から最後の発生まですべてを置き換えるためです。ボタン脱出する。成功するたびに再試行する:nためにタグに分岐しますt

関連情報