web-dev-qa-db-ja.com

テキストストリームからのANSIカラーコードの削除

からの出力を調べる

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'
86
user001

文字^[[37mおよび^[[0mANSIエスケープシーケンス(CSIコード) の一部です。こちらもご覧ください これらの仕様

GNU 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スター)によって使用され、メールレポート;-)

111
olibre

私はより良いエスケープシーケンスリムーバーを見つけました。これをチェックして:

Perl -pe 's/\x1b\[[0-9;]*[mG]//g'

22
user204331

^[として表示されるのは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'
10
user1686

単純なものが好きな場合は、私の strip-ansi-cli パッケージを使用できます( Node.js が必要です):

$ npm install --global strip-ansi-cli

次に、次のように使用します。

$ strip-ansi < colors.o

または単に文字列を渡します:

$ strip-ansi '^[[37mABC^[[0m'
9
Sindre Sorhus

commandlinefuがこの回答を提供します ANSIカラーと移動コマンドを削除します。

sed "s,\x1B\[[0-9;]*[a-zA-Z],,g"

ちょうど色のために、あなたは欲しい:

 sed "s,\x1B\[[0-9;]*m,,g"
6
Tom Hale

これはすべての信頼できる削除であると思います 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)。これを行う場合は、長いシーケンスに関与する可能性があるため、最後に削除してください。

4
Adam Katz

「答えられた」質問は私にとってはうまくいかなかったので、代わりにこの正規表現を作成して、Perl Term :: ANSIColorモジュールによって生成されたエスケープシーケンスを削除しました。

cat colors.o | Perl -pe 's/\x1b\[[^m]+m//g;

Grawityの正規表現は問題なく動作しますが、+を使用しても問題なく動作するようです。

2
castl3bravo

ansi2txt

https://unix.stackexchange.com/a/527259/116915

cat TypeScript | ansi2txt | col -b
2
yurenchen

"tput sgr0"がこの制御文字を残しました^(B ^ [
これは、それを処理するための修正バージョンです。

Perl -pe 's/\e[\[\(][0-9;]*[mGKFB]//g' logfile.log
1
GustafAnkarloo

PuTTYを介してインタラクティブなトップ出力の収集から追加された文字を削除することで同様の問題があり、これが役立ちました:

cat PuTTY1.log | Perl -pe 's/\x1b.*?[mGKH]//g'
0

これは私のために働いたものです(Mac OS Xでテストされました)

Perl -pe 's/\[[0-9;]*[mGKF]//g'
0
Miguel Mota