出力を調べる
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
と^[[0m
ANSI エスケープ シーケンス (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
次のような特殊文字はサポートされていません。\e
slmそして蒸し器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'
改善点
フラグは-e
GNU ではオプションです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 文字です。ESC
EscCtrl[^
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'