プログラム(色付き)の出力を取得し、を使用して出力しようとしていますtee
。出力に端末(stdout)の色を付けたいが、出力ファイルには色を付けたくない。これは可能ですか?
2 に答える
考えられるアプローチは、エスケープ文字をstderrに印刷し、メインコンテンツをstdoutに印刷することです。私はスクリプトの1つでそれを行いました。もちろん、スケーラブルなオプションではありません。
stdinを解析し、エスケープシーケンスをstderrに、その他をstdoutに配置する、専用のスクリプトを作成するのは興味深い演習です。:-)
それから、
./myScript.sh | filter_escapes | tee outfile.log
私はそれを行うスクリプトを見たことがありませんが、まだ利用できない場合は、それを書くのは面白いと思います。
あなたの質問に関する限り、私は以下で十分だと思います:
ls --color=always | sed -r 'w /dev/stderr' | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' > /tmp/test
ls --color=always
./your_script&/tmp/test
を目的の出力ファイル名に置き換えます。
その他の実装:
ls --color=always | tee >(sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' > /tmp/abcd)
注:tee >(sed .... > logfile)
構文
ノート:
- 正規表現はsampson-chenの回答から借用しました。
- sedの/dev/ stderrのwコマンドは、GNUSedの追加です。
はい、可能です。出力ファイルに渡す結果をパイプ処理して、sed
色の書式設定に使用されているエスケープ文字を削除します。
Linux の場合:
sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
GNU sed ではないため、OS X の場合:
sed -E "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
私が最近書いたツールの一部は、あなたが説明したこととまったく同じですtee
:
https://github.com/sampson-chen/sack/blob/master/sack
ack --color $sack__flags $@ $sack__cwd | tee >$sack__dev_null >(display_shortcuts) >(process_shorcut_paths | remove_escaped_chars > $sack__shortcut_file)
ここで、関数remove_escaped_chars
には OS バージョンのチェックが含まれており、sed
上記のようにスクリプトを適用します。
(注1:tee
出力のコピーを自動的に標準出力にリダイレクトするため、以前はそれ>$sack__dev_null
を防止していました:関数で定義されているように、標準出力に出力されるものに追加情報を追加したかったためですdisplay_shortcuts
)
(注 2:tee
それ自体は、私が使用したときに色の書式設定を完全に削除したことはありません。私の疑いは、パイプを使用した他のツールのデフォルトの動作です。)