196

I have some script that produces output with colors and I need to remove the ANSI codes.

#!/bin/bash

exec > >(tee log)   # redirect the output to a file but keep it on stdout
exec 2>&1

./somescript

The output is (in log file):

java (pid  12321) is running...@[60G[@[0;32m  OK  @[0;39m]

I didn't know how to put the ESC character here, so I put @ in its place.

I changed the script into:

#!/bin/bash

exec > >(tee log)   # redirect the output to a file but keep it on stdout
exec 2>&1

./somescript | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"

But now it gives me (in log file):

java (pid  12321) is running...@[60G[  OK  ]

How can I also remove this '@[60G?

Maybe there is a way to completely disable coloring for the entire script?

4

18 に答える 18

206

Wikipediaによると[m|K]、使用しているコマンドの は、(色コマンド) および(「行の一部を消去」コマンド)sedを処理するように特別に設計されています。あなたのスクリプトは絶対カーソル位置を 60 ( ) に設定して、あなたの行がカバーしていない行のすべての OK を取得しようとしています。mK^[[60Gsed

(適切には、パイプ文字に一致させようとしていないため、[m|K]おそらく(m|K)or[mK]である必要があります。しかし、それは今のところ重要ではありません。)

コマンドの最後の一致を[mGK]または(m|G|K)に切り替えると、その余分な制御シーケンスをキャッチできるはずです。

./somescript | sed -r "s/\x1B\[([0-9]{1,3}(;[0-9]{1,2})?)?[mGK]//g"
于 2013-08-01T17:13:08.113 に答える
6

うーん、これがうまくいくかどうかはわかりませんが、「tr」は制御コードを「ストリップ」(削除)します-試してください:

./somescript | tr -d '[:cntrl:]'
于 2014-04-03T17:31:36.647 に答える
3

@ jeff-bowmanのソリューションは、カラーコードの一部を取り除くのに役立ちました. さらに削除するために、正規表現に別の小さな部分を追加しました。

sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" # Original. Removed Red ([31;40m[1m[error][0m)
sed -r "s/\x1B\[([0-9];)?([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" # With an addition, removed yellow and green ([1;33;40m[1m[warning][0m and [1;32;40m[1m[ok][0m)
                ^^^^^^^^^
                remove Yellow and Green (and maybe more colors)
于 2016-03-13T19:50:00.033 に答える