スクリプト出力から制御文字(コンソールコード/色付き)を削除する

スクリプト出力から制御文字(コンソールコード/色付き)を削除する

「script」コマンドを使用して、コマンドラインから対話型セッションを記録できます。ただし、これにはすべての制御文字が含まれます。そしてカラーコード。 "col -b"を使用して制御文字(バックスペースなど)を削除できますが、カラーコードを削除する簡単な方法はありません。

コマンドラインを一般的な方法で使用したいので、色を無効にしたくありません。ただスクリプト出力から色を削除したいです。また、問題を解決する正規表現を見つけることが可能であることを知っていますが、よりシンプルで信頼性の高い解決策が必要です。正規表現を開発するときに私が知らないコードがあるとどうなりますか?

ディスプレイの問題:

spl62 tmp:スクリプト
スクリプトが起動し、ファイルがTypeScriptです。
spl62 lepl: ls
add-licence.sed build-example.sh テスト送信 Push-docs.sh
追加-licence.sh build.sh 削除-licence.sed setup.py
asn ビルド-テスト.sh 削除-licence.sh src
build-doc.sh は doc-src test.ini をクリーンアップします。
spl62 lepl:終了
スクリプトが完了し、ファイルはTypeScriptです。
spl62 tmp: cat -v タイプスクリプト
スクリプトは2011年6月9日木曜日午前9時47分27秒CLTで開始されました。
spl62 lepl: ls^M
^[[0m^[[00madd-licence.sed^[[0m ^[[00;32mbuild-example.sh^[[0m ^[[00mcommit-test^]][[0m ^[[00;32mpush-docs.sh] ) ] ^[[0m^m
^[[00;32madd-licence.sh^[[0m ^[[00;32mbuild.sh^[[0m ^[[00mdelete-licence.sed^][[0m ^[[00msetup.py^]][[0m^M] ) ]
^[[01;34masn^[[0m ^[[00;32mbuild-test.sh^[[0m ^[[00;32mdelete-licence.sh^[[0m ^[[01;34msrc^]][[0m^M]] ) ]
^[[00;32mbuild-doc.sh^[[0m ^[[00;32mclean^[[0m ^[[01;34mdoc-src^[[0m ^[[00mtest.ini^[[0m^M]]]]
spl62 lepl: 終了^M

スクリプトは2011年6月9日木曜日午前9時47分29秒CLTで完了しました。
spl62 tmp: col -b < タイプスクリプト
スクリプトは2011年6月9日木曜日午前9時47分27秒CLTで開始されました。
spl62 lepl: ls
0m00madd-licence.sed0m 00;32mbuild-example.sh0m 00mcommit-test0m 00;32mpush-docs.sh0m
00;32madd-licence.sh0m 00;32mbuild.sh0m 00mdelete-licence.sed0m 00msetup.py0m
01;34masn0m 00;32mbuild-test.sh0m 00;32mdelete-licence.sh0m 01;34msrc0m
00;32mbuild-doc.sh0m 00;32mclean0m 01;34mdoc-src0m 00mtest.ini0m
spl62 lepl:終了

スクリプトは2011年6月9日木曜日午前9時47分29秒CLTで完了しました。

答え1

次のスクリプトでは、すべてのANSI / VT100 / xterm制御シーケンスをフィルタリングする必要があります(基準:ctseq)。最小限のテスト後に過小または過小一致する項目を報告してください。

#!/usr/bin/env perl
## uncolor — remove terminal escape sequences such as color changes
while (<>) {
    s/ \e[ #%()*+\-.\/]. |
       \e\[ [ -?]* [@-~] | # CSI ... Cmd
       \e\] .*? (?:\e\\|[\a\x9c]) | # OSC ... (ST|BEL)
       \e[P^_] .*? (?:\e\\|\x9c) | # (DCS|PM|APC) ... ST
       \e. //xg;
    print;
}

既知の問題:

  • 間違ったシーケンスについて文句を言わないでください。これはこのスクリプトの目的ではありません。
  • DCS / PM / APC / OSCの複数行文字列パラメーターはサポートされていません。
  • 128から159の範囲のバイトは制御文字で解析できますが、ほとんど使用されません。これは非ASCII制御文字を解析するバージョンです(これにより、UTF-8を含む一部のエンコーディングでは非ASCIIテキストが壊れます)。
#!/usr/bin/env perl
## uncolor — remove terminal escape sequences such as color changes
while (<>) {
    s/ \e[ #%()*+\-.\/]. |
       (?:\e\[|\x9b) [ -?]* [@-~] | # CSI ... Cmd
       (?:\e\]|\x9d) .*? (?:\e\\|[\a\x9c]) | # OSC ... (ST|BEL)
       (?:\e[P^_]|[\x90\x9e\x9f]) .*? (?:\e\\|\x9c) | # (DCS|PM|APC) ... ST
       \e.|[\x80-\x9f] //xg;
    print;
}

答え2

更新中ザイルズの答えキャリッジリターンを削除し、前の文字のバックスペース削除を実行することも可能です。どちらもCygwinでTypeScriptを作成するときに重要です。

#!/usr/bin/perl

while (<>) {
  s/ \e[ #%()*+\-.\/]. |
    \r | # Remove extra carriage returns also
    (?:\e\[|\x9b) [ -?]* [@-~] | # CSI ... Cmd
    (?:\e\]|\x9d) .*? (?:\e\\|[\a\x9c]) | # OSC ... (ST|BEL)
    (?:\e[P^_]|[\x90\x9e\x9f]) .*? (?:\e\\|\x9c) | # (DCS|PM|APC) ... ST
    \e.|[\x80-\x9f] //xg;
    1 while s/[^\b][\b]//g;  # remove all non-backspace followed by backspace
  print;
}

答え3

一つあるansi2txtcolorized-logsUbuntu パッケージのコマンドです。 ANSIカラーコードを削除するのには効果的ですが、テキストのエクスポートによって生成されるプログレスバー^H^M文字をオーバーレイするなどの操作は処理しません。 col -b扱うことができるそれらしたがって、最良の結果を得るには、2つを組み合わせることができます。

cat typescript | ansi2txt | col -b

答え4

cat typescript | perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' | col -b > typescript-processed

関連情報