GNU/Linux >> Linux の 問題 >  >> Linux

スクリプト出力から制御文字(コンソールコード/色を含む)を削除しますか?

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

コマンドラインを通常の方法で使用したいので、そこで色を無効にしたくないことに注意してください。スクリプト出力から色を削除したいだけです。また、いろいろ試して正規表現を見つけて修正することもできますが、もっと簡単な(そしてより信頼性の高い-正規表現を開発するときにわからないコードがある場合はどうなるでしょうか?)ソリューションがあることを望んでいます。

問題を表示するには:

spl62 tmp: script
Script started, file is typescript
spl62 lepl: ls
add-licence.sed  build-example.sh  commit-test         push-docs.sh
add-licence.sh   build.sh          delete-licence.sed  setup.py
asn              build-test.sh     delete-licence.sh   src
build-doc.sh     clean             doc-src             test.ini
spl62 lepl: exit
Script done, file is typescript
spl62 tmp: cat -v typescript
Script started on Thu 09 Jun 2011 09:47:27 AM 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: exit^M

Script done on Thu 09 Jun 2011 09:47:29 AM CLT
spl62 tmp: col -b < typescript 
Script started on Thu 09 Jun 2011 09:47:27 AM 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: exit

Script done on Thu 09 Jun 2011 09:47:29 AM CLT

承認された回答:

次のスクリプトは、(ctlseqsに基づく)のすべてのANSI / VT100/xterm制御シーケンスを除外する必要があります。最小限のテストで、一致不足または一致超過を報告してください。

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

Linux
  1. Linuxはコンソール出力をログファイルに追加しますか?

  2. MYSQL はスクリプトからの出力が異なります

  3. シェル スクリプトでの複数行出力のインデント

  1. bashスクリプトが同時に実行されないようにする

  2. Linux –ユーザースペースからコンソールとして/ dev / fb0を使用する方法、またはそれにテキストを出力する方法は?

  3. スクリプトからキーが押されたかどうかを検出しますか?

  1. シェルスクリプトはどこから実行されますか?

  2. URLからbashスクリプトを実行

  3. PHP から Python スクリプトを実行する