STDINをカラーコードを削除してSTDOUTに渡すプログラム


64

出力をカラーで生成するコマンドがあり、カラーコードを削除したファイルにパイプで送信したいと思います。catカラーコードを削除する以外は同じように機能するコマンドはありますか?私はこのようなことをする予定です:

$ command-that-produces-colored-output | stripcolorcodes > outfile

4
これは、プログラムが出力をファイルにリダイレクトされていても、その後の色の出力を生成し、バグかもしれないし、それをオフにするオプションを提供していません。出力を色付けするプログラムは、isatty(stdin)そうする前にチェックすることを期待しています。そのプログラムとは何ですか?
アレックス

パススルーcat-実行したクイックテストではgrep --color=auto myusername /etc/passwd、ユーザー名が赤で、白いテキストが他にあります。 grep --color=auto myusername /etc/passwd | cat私にプレーンホワイトテキストを与える
-ivanivan

1
それは解決策ではありません。これgrep --color=autoは、標準出力が端末でない場合にカラー出力を生成しないためにのみ機能します。私は無条件にカラーコードを出力するコマンドについて話している。(アレックスは上記の指摘するように、そのような行動は間違いなくバグですが、時には我々は我々が簡単に自分自身を修正することはできません不完全なソフトウェアで動作する必要があり、それはこの質問が何であるかだ。)
ライアン・トンプソン

回答:


59

あなたはそのためのユーティリティがあると思うでしょうが、私はそれを見つけることができませんでした。ただし、このPerlの1ライナーでトリックを行う必要があります。

perl -pe 's/\e\[?.*?[\@-~]//g'

例:

$ command-that-produces-colored-output | perl -pe 's/\e\[?.*?[\@-~]//g' > outfile

または、スクリプトが必要な場合は、次の名前で保存できますstripcolorcodes

#! /usr/bin/perl

use strict;
use warnings;

while (<>) {
  s/\e\[?.*?[\@-~]//g; # Strip ANSI escape codes
  print;
}

カラーコードのみを取り除き、他のANSIコード(カーソルの移動など)をそのまま残したい場合は、

s/\e\[[\d;]*m//g;

上記で使用した置換の代わりに(すべてのANSIエスケープコードを削除します)。


9
別の回答(unix.stackexchange.com/questions/4527/…)へのコメントで述べたように、この正規表現はから取得されましたTerm::ANSIColor。あなたの情報源を認めてください!
forivall

2
あなたの情報源を認めてください!
ユルゲンポール

29

GNU sedでカラーコード(特殊文字)を削除する

sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"

または

PythonでANSIエスケープシーケンスを削除する

colorama pythonパッケージ(pip install colorama)をインストールします。に入れるstripcolorcodes

#!/usr/bin/env python
import colorama, fileinput, sys;
colorama.init(strip=True);

for line in fileinput.input():
    sys.stdout.write(line)

を実行しますchmod +x stripcolorcodes


これはすごい。まさに私が必要なもの!
adivis12

Pythonは少し遅いですが、sed印象的です:)

2
pythonを試しませんでしたが、sedバージョンはすべての色を取り除きません。(私は徹底的にテストしませんでしたが、背景色を一部そのまま残したので、より高速なperlオプションを使用しました。)
rsaw

22

Term :: ANSIColorモジュールをインストールできる場合、このperlスクリプトは機能します。

#!/usr/bin/env perl
use Term::ANSIColor qw(colorstrip);
print colorstrip $_ while <>;

5
それは実際に私がそのカラーコードのみの正規表現を得た場所です。しかし、その正規表現だけのためにモジュール全体をインストールするのは少し大変です。
cjm

4
まあ、cpanmを正しく設定すると、約5秒でモジュールがインストールされます。
ライアントンプソン

スクリプトをファイルに書き込む必要はありません。:にジャストパイプperl -mTerm::ANSIColor=colorstrip -n -e 'print colorstrip $_'
ジェシー・グリック

10

システムがNodeJSにアクセスできる場合は、次のNodeパッケージをインストールできますstrip-ansi-cli

$ npm install -g strip-ansi-cli

その後、次のようにコマンドを実行できます。

$ command-that-produces-colored-output | strip-ansi > outfile

1
ほとんどのシステムに既に存在する言語とツールを使用できるソリューションがある場合、NodeJSは大きな依存関係になります。
-user137369

また、これは記載されている最も遅いソリューションである(参照ここでは)、あなたはおそらくだろう違いに気付きます。

3

このsedコマンドは私のためにそれをしました:

sed -r "s/\\^\\[(\\[[^@-~]+[@-~]|[0-9@-_]|%@)//g"

例:

$ command-that-produces-colored-output | sed -r "s/\\^\\[(\\[[^@-~]+[@-~]|[0-9@-_]|%@)//g" > outfile

これはの最新バージョンでは動作しないようですsed

3

これにはacを使用できます。上記のリストよりも高速である必要があります(ただしperlsed適切である必要があります)。以下に例を示します。

curl -s wttr.in/LA | ac -s

免責事項:カラーフィルター機能は私が作成しました。


3
「ac」へのリンクが役立ちます。;)
Vitaly Kushner

acプログラムは、ここにあるように思わ:hub.darcs.net/vmchale/fastcat
マイケル・バリ

1
$ command-that-produces-colored-output | ansifilter

...そして必要に応じて、 (dnf, ...) install ansifilter

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.