Renk kodları çıkarılmış halde STDIN'i STDOUT'a geçen program mı?


64

Renkli çıktı üreten bir komutum var ve onu renk kodlarının çıkardığı bir dosyaya aktarmak istiyorum. catRenk kodlarını çıkarması dışında bir komut var mı ? Böyle bir şey yapmayı planlıyorum:

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

4
Bir programın çıktıyı bir dosyaya yönlendirdiği halde bile renkli çıktı ürettiği bir hata olabilir ve onu kapatmak için bir seçenek sunmaz. Bunu isatty(stdin)yapmadan önce çıktısını renklendiren herhangi bir programın kontrol etmesini beklerdim . Bu programın ne olduğunu paylaşmak ister misiniz?
alex

üzerinden geçmek cat- koştuğum hızlı test grep --color=auto myusername /etc/passwdbana kullanıcı adımı kırmızı beyaz metin elsewhree ile veriyor. grep --color=auto myusername /etc/passwd | catbana düz beyaz metin veriyor
ivanivan 15:17

1
Bu bir çözüm değil. Yalnızca çalışır çünkü grep --color=autostandart çıktı bir terminal olmadığında renkli çıktı üretmekten kaçınır. Koşulsuz renk kodları veren bir komuttan bahsediyorum. (Alex yukarıda da belirtildiği gibi, bu tür davranışlar tartışmasız bir hatadır, ancak bazen kendimizi kolayca düzeltemeyeceğimiz kusurlu bir yazılımla çalışmamız gerekir ve bu sorunun konusu budur.)
Ryan Thompson

Yanıtlar:


59

Bunun bir faydası olacağını düşünebilirsin, ama bulamadım. Ancak, bu Perl bir astar hile yapmak gerekir:

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

Örnek:

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

Veya bir komut dosyası istiyorsanız, aşağıdaki gibi kaydedebilirsiniz stripcolorcodes:

#! /usr/bin/perl

use strict;
use warnings;

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

Yalnızca renk kodlarını çıkarmak ve diğer ANSI kodlarını (imleç hareketi gibi) yalnız bırakmak istiyorsanız ,

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

Yukarıda kullanılan yerine kullanılan tüm (ANSI kaçış kodları kaldırır) yerine kullanılan yerine.


9
Başka bir cevaba yapılan bir yorumda ( unix.stackexchange.com/questions/4527/… ) belirtildiği gibi, bu regex çıkarıldı Term::ANSIColor. Kaynaklarınızı onaylayın, lütfen!
forivall

2
Kaynaklarınızı onaylayın!
Jürgen Paul

29

GNU sed ile renk kodlarını (özel karakterler) kaldırın

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

Veya

Python’da ANSI çıkış dizilerini soyun

Colorama python paketini ( pip install colorama) kurun . İçine koymak stripcolorcodes:

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

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

Run chmod +x stripcolorcodes.


Bu harika. Tam olarak ihtiyacım olan şey!
adivis12

Python biraz yavaş ama sedetkileyici :)

2
Python'u denemedim ama sed sürümü tüm renkleri çıkarmıyor. (Ben etraflıca test etmedi, ama sağlam bazı arka plan renklerini bıraktı, bu yüzden daha hızlı perl seçeneği ile gitti.)
rsaw

22

Term :: ANSIColor modülünü kurabilirseniz , bu perl betiği çalışır:

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

5
Aslında o renk kodları sadece regex aldım. Ancak sadece bir regex için bütün bir modül kurmak biraz daha fazla.
cjm

4
Eğer cpanm'ı doğru ayarladıysanız, modülü yaklaşık 5 saniye içerisinde kurar.
Ryan Thompson,

Komut dosyasını dosyaya yazmaya gerek yoktur. Sadece pipo:perl -mTerm::ANSIColor=colorstrip -n -e 'print colorstrip $_'
Jesse Glick

10

Sisteminizin NodeJS'ye erişimi varsa, aşağıdaki Node paketini kurabilirsiniz strip-ansi-cli,.

$ npm install -g strip-ansi-cli

Daha sonra komutunuzu şöyle çalıştırabilirsiniz:

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

1
NodeJS, çoğu sistemde zaten mevcut olan dilleri ve araçları kullanabilen çözümler olduğunda, büyük bir bağımlılıktır.
user137369 14:17

Ayrıca, bu listelenen en yavaş çözümdür ( buraya bakın ) ve muhtemelen farkı göreceksiniz .

3

Bu sed komutu benim için yaptı:

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

Örnek:

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

Bu en son sürümüyle çalışmıyor gibi görünüyor sed.

3

Bunun için ac kullanabilirsiniz . Yukarıda sıralanan herşeyden daha hızlı olmalıdır (gerçi perlve sednezih olmalı). İşte bir örnek:

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

Feragatname olarak: Renk filtreleme işlevi benim tarafımdan yazılmıştır.


3
'ac' bağlantısına yardımcı olun. ;)
Vitaly Kushner

acProgram burada gibi görünüyor: hub.darcs.net/vmchale/fastcat
Michael Burr

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

... ve gerekirse (dnf, ...) install ansifilter

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.