キャリッジリターン(^ M)を使用してテキストファイルを「レンダリング」し、出力をファイルに保存する

キャリッジリターン(^ M)を使用してテキストファイルを「レンダリング」し、出力をファイルに保存する

長い間実行され、デフォルトで最後に「\ n」を持たないループの一部のテキストを印刷し、次の反復では「\ r」を印刷して消去する一連の進行状況バーを持つPython CLIプログラムがあります。その行にいくつかのテキストを再印刷するなどの操作が行われます。

while some_condition:
    print "\rprocessed {} out of {}".format(done_counter, all_counter),

コンソールでは完璧に動作しますが、stdoutをファイルにリダイレクトすると、当然、「Processed... ^M」がたくさん表示されます。私が望むのは、すべての "^ M"が処理された状態でコンソールに表示されるファイルのクリーンで "レンダリングされた"表現を取得することです。私はこれらの制御文字を削除するのではなく、テキストに適用したいと思います。

現在の解決策として、次のようにします。tail -n<NUM_LINES> screenlog_file十分に大きくして<NUM_FILES>から、マウスで「レンダリングされた」テキストを選択し、そのアリペーストを新しいファイルにコピーします。これを達成するより便利な方法があるかどうか疑問に思います。

編集する

@Archemarのおかげで見つけました。これ。コードを修正できるため、現在の問題は解決されます。ただし、Linuxユーティリティのみを使用するアイデア/解決方法は高く評価されます。

答え1

これらのアプリケーションでは、ランチャーを使用しscript(出力をファイルにリダイレクトするときの動作の変更を防ぐため)、typescriptsedスクリプトを使用して結果ファイルをフィルタリングします。たとえば、私の答えを参照してください。Unixユーティリティを使用してプログラムでANSI制御コードをファイルに「書き込み」できますか?議論するscript2log

コメントに記載されているような他の例もあります。ただし、言及されている内容は、この特別なケース(キャリッジリターン文字が使用されている場合)を扱いません。吹くテキスト)、しかし削除する制御文字

関連情報