毎秒数百行程度の非常に詳細な出力を生成するコマンドがあります。ただし、このコマンドは\r
進行状況バーと同じ方法で前の出力行を上書きするために使用されます。時々、現在の出力線を「焼く」端子に改行文字を書き込みます。
この出力をファイルにリダイレクトすると、数百メガバイトの出力が生成されます。キャリッジリターンが発生すると、各行は「上書きされる」代わりにファイルに書き込まれます。
私はこれが期待される動作であることを知っており、この問題を解決する1つの方法は、プログラムをよりスマートにし、この対話状態を印刷する代わりにファイルにリダイレクトされることを認識することです。ただし、このプログラムを変更することはできません。
最終出力ファイルの内容が端末で対話的に実行されたときに表示されるものと同じになるように、この出力をパイプ/フィルタリングする方法はありますか?
私は試した:
spammy_cr_command | uniq
...出力はないものと同じです。uniq
そして:
spammy_cr_command | sed '/\r/d'
...これは改行文字を含む「焼き」行も削除します。
ベストアンサー1
cmd | sed -e 's/.*\r//' > file
これにより、各行のキャリッジリターンの後のすべてのテキストが何も変わらず、最後のキャリッジリターンの後の行部分のみが残ります。これはない〜しなければならない端末に残っているのと同じですが、ほとんどの場合は近似です。
特に、1 行が次の行より長い場合は処理されません。このプログラムは間違った結果を提供します。
printf 'abcdefg\rxyz\n'
printf '123456789\r\nxyz\n'
なぜなら明らかに残るのは
xyzdefg
123456789
xyz
また、sed
削除されていないすべての文字をスキップします。
xyz
xyz
プログラムがこのように動作することを確認できます。進行状況バーなどでカーソルが左端に固定されて、目的の結果が得られないことがよくあります。