からの出力を調べる
Perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";'
テキストエディタ(例:vi
)では次のように表示されます。
^[[37mABC
^[[0m
ANSIカラーコードを出力ファイルからどのように削除しますか?最善の方法は、出力をある種のストリームエディタにパイプ処理することだと思います。
以下は動作しません
Perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' | Perl -pe 's/\^\[\[37m//g' | Perl -pe 's/\^\[\[0m//g'
文字^[[37m
および^[[0m
は ANSIエスケープシーケンス(CSIコード) の一部です。こちらもご覧ください これらの仕様 。
sed
sed 's/\x1b\[[0-9;]*m//g'
\x1b
(または\x1B
)はescape特殊文字ですsed
は代替案\e
および\033
をサポートしていません)\[
は、エスケープシーケンスの2番目の文字です。[0-9;]*
は色の値の正規表現ですm
は、エスケープシーケンスの最後の文字です。mac macOSでは、デフォルトのsed
コマンドは、コメントの slm および steamer25 で指摘されている\e
などの特殊文字をサポートしていません。代わりに、brew install gnu-sed
を使用してインストールできるgsed
を使用してください。
OPのコマンドラインの例: (OPはオリジナルのポスターを意味します)
Perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' |
sed 's/\x1b\[[0-9;]*m//g'
Tom Hale は、グラフィックスモード(カラー)エスケープシーケンスに固有の文字m
の代わりに[a-zA-Z]
を使用して、他のすべてのエスケープシーケンスを削除することを提案します。ただし、[a-zA-Z]
は幅が広すぎて削除しすぎる可能性があります。 MichałFaleński および Miguel Mota は、それぞれ[mGKH]
および[mGKF]
を使用して一部のエスケープシーケンスのみを削除することを提案します。 Britton Kerin は、K
に加えてm
も使用して、gcc
エラー/警告から色を削除する必要があることを示します(リダイレクトすることを忘れないでくださいgcc 2>&1 | sed...
)。
sed 's/\x1b\[[0-9;]*m//g' # Remove color sequences only
sed 's/\x1b\[[0-9;]*[a-zA-Z]//g' # Remove all escape sequences
sed 's/\x1b\[[0-9;]*[mGKH]//g' # Remove color and move sequences
sed 's/\x1b\[[0-9;]*[mGKF]//g' # Remove color and move sequences
Last escape
sequence
character Purpose
--------- -------------------------------
m Graphics Rendition Mode (including Color)
G Horizontal cursor move
K Horizontal deletion
H New cursor position
F Move cursor to previous n lines
Perl
の使用一部のオペレーティングシステムにインストールされているsed
のバージョンは制限されている場合があります(macOSなど)。コマンドPerl
には、より多くのオペレーティングシステムでのインストール/更新が一般的に簡単になるという利点があります。 Adam Katz[〜#〜] pcre [〜#〜] で\e
(\x1b
と同じ)を使用することをお勧めします。
フィルタリングするコマンドの量に応じて、正規表現を選択します。
Perl -pe 's/\e\[[0-9;]*m//g' # Remove colors only
Perl -pe 's/\e\[[0-9;]*[mG]//g'
Perl -pe 's/\e\[[0-9;]*[mGKH]//g'
Perl -pe 's/\e\[[0-9;]*[a-zA-Z]//g'
Perl -pe 's/\e\[[0-9;]*m(?:\e\[K)?//g' # Adam Katz's trick
OPのコマンドラインの例:
Perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' \
| Perl -pe 's/\e\[[0-9;]*m//g'
Stuart Cardall のコメントで指摘されているように、このsed
コマンドラインはプロジェクト ltimate Nginx Bad Bot (1000スター)によって使用され、メールレポート;-)
私はより良いエスケープシーケンスリムーバーを見つけました。これをチェックして:
Perl -pe 's/\x1b\[[0-9;]*[mG]//g'
^[
として表示されるのはnot^
および[
;です。 ASCII ESC
文字であり、 Esc または Ctrl[ (^
表記はCtrlキーを意味します)。
ESC
は0x1Bの16進数または033の8進数であるため、正規表現で\x1B
または\033
を使用する必要があります。
Perl -pe 's/\033\[37m//g; s/\033[0m//g'
Perl -pe 's/\033\[\d*(;\d*)*m//g'
単純なものが好きな場合は、私の strip-ansi-cli パッケージを使用できます( Node.js が必要です):
$ npm install --global strip-ansi-cli
次に、次のように使用します。
$ strip-ansi < colors.o
または単に文字列を渡します:
$ strip-ansi '^[[37mABC^[[0m'
commandlinefuがこの回答を提供します ANSIカラーと移動コマンドを削除します。
sed "s,\x1B\[[0-9;]*[a-zA-Z],,g"
ちょうど色のために、あなたは欲しい:
sed "s,\x1B\[[0-9;]*m,,g"
これはすべての信頼できる削除であると思います ANSIエスケープシーケンス :
Perl -pe '
s/\e\[[\x30-\x3f]*[\x20-\x2f]*[\x40-\x7e]//g;
s/\e[PX^_].*?\e\\//g;
s/\e\][^\a]*(?:\a|\e\\)//g;
s/\e[\[\]A-Z\\^_@]//g;'
(Perlは、他の多くの言語(sedではない)と同様に、エスケープ文字として\e
を受け入れます。 Esc、\x1b
または\033
コードで、ターミナルでは^[
として表示されます。直感的に見えるので、ここで使用しています。)
このPerlコマンドは、必要に応じてすべて1行で実行でき、4つの置換が含まれています。
最初はCSIシーケンス(「Control Sequence Introducer」で始まるエスケープコードシーケンス)の後に続きます。 Esc[、これは、カラーコードやその他のテキスト装飾を構成する Select Graphic Renditionシーケンス よりも多くをカバーしています。
2番目の置換では、末尾の文字を含み、ST(文字列ターミネーター、 Esc\)。 3番目の置換は同じですが、 オペレーティングシステムコマンド シーケンスを [〜#〜] bel [〜#〜] (\x07
、 \007
、多くの場合\a
)。
4番目の置換では、残りのエスケープを削除します。
また、他のゼロ幅ASCII BELやその他のあいまいな C0およびC1制御文字 などの文字を削除することも検討してください。私はs/[\x00-\x1f\x7f-\x9f\xad]+//g
を使用しています。 Delete および Soft Hyphen も含まれます。これにより、Unicodeのよりコード化されたゼロ幅文字は除外されますが、ASCII(Unicode \x00
-\xff
)。これを行う場合は、長いシーケンスに関与する可能性があるため、最後に削除してください。
「答えられた」質問は私にとってはうまくいかなかったので、代わりにこの正規表現を作成して、Perl Term :: ANSIColorモジュールによって生成されたエスケープシーケンスを削除しました。
cat colors.o | Perl -pe 's/\x1b\[[^m]+m//g;
Grawityの正規表現は問題なく動作しますが、+を使用しても問題なく動作するようです。
"tput sgr0"がこの制御文字を残しました^(B ^ [
これは、それを処理するための修正バージョンです。
Perl -pe 's/\e[\[\(][0-9;]*[mGKFB]//g' logfile.log
PuTTYを介してインタラクティブなトップ出力の収集から追加された文字を削除することで同様の問題があり、これが役立ちました:
cat PuTTY1.log | Perl -pe 's/\x1b.*?[mGKH]//g'
これは私のために働いたものです(Mac OS Xでテストされました)
Perl -pe 's/\[[0-9;]*[mGKF]//g'