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

テキストストリームから 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'

答え1

キャラクター^[[37m^[[0mANSI エスケープ シーケンス (CSI コード)参照これらの仕様

GNUの使用sed

sed -e 's/\x1b\[[0-9;]*m//g'
  • \x1b(または\x1B)は逃げる特殊文字
    (GNUは代替文字とをsedサポートしていません)\e\033
  • \[エスケープシーケンスの2番目の文字です
  • [0-9;]*色の値の正規表現です
  • mエスケープシーケンスの最後の文字です

macOSのデフォルトを使用するsed

マイク提案:

sed -e $'s/\x1b\[[0-9;]*m//g'

macOSのデフォルトでは、sed次のような特殊文字はサポートされていません。\eslmそして蒸し器25コメント欄に。

をインストールするにはgsed

brew install gnu-sed

OPのコマンドラインの例

(OPはオリジナルポスターを意味します)

perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' | 
      sed 's/\x1b\[[0-9;]*m//g'

改善点

フラグは-eGNU ではオプションですsedが、macOS のデフォルトでは必須ですsed

sed 's/\x1b\[[0-9;]*m//g'           # Remove color sequences only

トム・ヘイルグラフィック モードのエスケープ シーケンス (色) に固有の[a-zA-Z]文字だけでなく、他のすべてのエスケープ シーケンスも削除することを提案します。m

sed 's/\x1b\[[0-9;]*[a-zA-Z]//g'    # Remove all escape sequences

ただし、[a-zA-Z]幅が広すぎると、削除しすぎる可能性があります。ミハウ・ファレンスキそしてミゲル・モタ[mGKH]それぞれとを使用して、一部のエスケープ シーケンスのみを削除することを提案します[mGKF]

sed 's/\x1b\[[0-9;]*[mGKH]//g'      # Remove color and move sequences
sed 's/\x1b\[[0-9;]*[mGKF]//g'      # Remove color and move sequences
sed 's/\x1b\[[0-9;]*[mGKHF]//g'     # Remove all
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

ブリトン・ケリンKは、(に加えてm)エラー/警告から色を削除することを示しますgcc。 をリダイレクトすることを忘れないでくださいgcc 2>&1 | sed...

使用perl

一部のオペレーティング システムにインストールされているのバージョンはsed制限される場合があります (例: macOS)。このコマンドには、perlより多くのオペレーティング システムでのインストール/更新が一般的に容易であるという利点があります。アダム・カッツ\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'

使用法

指摘したようにスチュアート・カーダルのコメントによると、このsedコマンドラインはプロジェクトで使用されている究極の Nginx 悪質ボット(1000 個の星) 電子メール レポートをクリーンアップします ;-)

答え2

MacOS を使用している場合、より優れたエスケープ シーケンス除去ツールを見つけました。こちらを確認してください:

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

答え3

ANSI2TXT の

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

cat typescript | ansi2txt | col -b
  • ansi2txt: ANSIカラーコードを削除
  • col -b: 削除^Hまたは^M


更新: 列ハンドルのタブとスペースについて // @DanielF が言及

〇.colスペースとタブの扱いについて

col -bx'\t' を ' ' に置き換え、 col -bh' ' を '\t' に置き換えます。

//colスペース/タブをそのまま保持できないようです。残念です。


0. 元の文字列

$ echo -e '        ff\tww' | hd
00000000  20 20 20 20 20 20 20 20  66 66 09 77 77 0a        |        ff.ww.|

1. -h スペースをタブに置き換える

$ echo -e '        ff\tww' | col -b | hd
00000000  09 66 66 09 77 77 0a                              |.ff.ww.|
$ echo -e '        ff\tww' | col -bh | hd
00000000  09 66 66 09 77 77 0a                              |.ff.ww.|
$ echo -e '        ff\tww' | col -bxh | hd
00000000  09 66 66 09 77 77 0a                              |.ff.ww.|

2. -x タブをスペースに置き換える

$ echo -e '        ff\tww' | col -bx | hd
00000000  20 20 20 20 20 20 20 20  66 66 20 20 20 20 20 20  |        ff      |
00000010  77 77 0a                                          |ww.|
$ echo -e '        ff\tww' | col -bhx | hd
00000000  20 20 20 20 20 20 20 20  66 66 20 20 20 20 20 20  |        ff      |
00000010  77 77 0a                                          |ww.|

3.colスペースとタブをそのまま保持できないようです。

答え4

^[そのまま表示されるものない ^および; は、または(表記は Ctrl キーを意味します)によって生成される[ASCII 文字です。ESCEscCtrl[^

ESCは 16 進数では 0x1B、8 進数では 033 なので、正規表現で\x1Bは または を使用する必要があります。\033

perl -pe 's/\033\[37m//g; s/\033[0m//g'

perl -pe 's/\033\[\d*(;\d*)*m//g'

関連情報