20

プログラム(色付き)の出力を取得し、を使用して出力しようとしていますtee。出力に端末(stdout)の色を付けたいが、出力ファイルには色を付けたくない。これは可能ですか?

4

2 に答える 2

4

考えられるアプローチは、エスケープ文字を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)構文

ノート:

  1. 正規表現はsampson-chenの回答から借用しました。
  2. sedの/dev/ stderrのwコマンドは、GNUSedの追加です。
于 2012-11-07T08:15:11.830 に答える
1

はい、可能です。出力ファイルに渡す結果をパイプ処理して、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それ自体は、私が使用したときに色の書式設定を完全に削除したことはありません。私の疑いは、パイプを使用した他のツールのデフォルトの動作です。)

于 2012-11-06T17:06:25.160 に答える