Program yang meneruskan STDIN ke STDOUT dengan kode warna dilucuti?

64

Saya memiliki perintah yang menghasilkan keluaran berwarna, dan saya ingin menyalurkannya ke file dengan kode warna dilucuti. Apakah ada perintah yang berfungsi seperti catkecuali bahwa itu strip kode warna? Saya berencana melakukan sesuatu seperti ini:

$ command-that-produces-colored-output | stripcolorcodes > outfile
Ryan Thompson
sumber
4
Mungkin saja bug bahwa suatu program menghasilkan keluaran berwarna meskipun keluarannya diarahkan ke suatu file dan tidak memberikan opsi untuk mematikannya. Saya mengharapkan program apa pun yang mewarnai keluarannya untuk diperiksa isatty(stdin)sebelum melakukannya. Pikiran untuk berbagi program apa itu?
alex
lulus cat- tes cepat saya berlari grep --color=auto myusername /etc/passwdmemberi saya nama pengguna saya merah dengan teks putih elsewhree. grep --color=auto myusername /etc/passwd | catmemberi saya teks putih polos
ivanivan
1
Itu bukan solusi. Ini hanya berfungsi karena grep --color=automenghindari menghasilkan keluaran berwarna ketika keluaran standar bukan terminal. Saya berbicara tentang perintah yang tanpa syarat menampilkan kode warna. (Seperti yang ditunjukkan alex di atas, perilaku semacam itu bisa dibilang bug, tetapi kadang-kadang kita perlu bekerja dengan perangkat lunak yang tidak sempurna sehingga kita tidak dapat dengan mudah memperbaiki diri, dan itulah pertanyaannya.)
Ryan Thompson
Kemungkinan relevan unix.stackexchange.com/questions/14684/…
Chris Stryczynski

Jawaban:

59

Anda akan berpikir akan ada utilitas untuk itu, tetapi saya tidak dapat menemukannya. Namun, Perl one-liner ini harus melakukan trik:

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

Contoh:

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

Atau, jika Anda menginginkan skrip, Anda dapat menyimpannya sebagai stripcolorcodes:

#! /usr/bin/perl

use strict;
use warnings;

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

Jika Anda ingin menghapus hanya kode warna, dan biarkan kode ANSI lainnya (seperti gerakan kursor), gunakan

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

bukannya substitusi yang saya gunakan di atas (yang menghapus semua kode pelarian ANSI).

cjm
sumber
9
Seperti disebutkan dalam komentar untuk jawaban lain ( unix.stackexchange.com/questions/4527/… ), regex ini ditarik dari Term::ANSIColor. Tolong akui sumber Anda!
forivall
2
mengakui sumber Anda!
Jürgen Paul
29

Hapus kode warna (karakter khusus) dengan sed GNU

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

Atau

Strip urutan melarikan diri ANSI di Python

Instal paket colorama python ( pip install colorama). Dimasukkan ke dalam stripcolorcodes:

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

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

Lari chmod +x stripcolorcodes.

jfs
sumber
Ini luar biasa. Apa yang saya butuhkan!
adivis12
Python agak lambat tetapi sedsangat mengesankan :)
2
Tidak mencoba python, tetapi versi sed tidak menghapus semua warna. (Saya tidak menguji secara mendalam, tetapi meninggalkan beberapa warna latar belakang utuh, jadi saya memilih opsi perl yang lebih cepat.)
rsaw
22

Jika Anda dapat menginstal modul Term :: ANSIColor , skrip perl ini berfungsi:

#!/usr/bin/env perl
use Term::ANSIColor qw(colorstrip);
print colorstrip $_ while <>;
Ryan Thompson
sumber
5
Di situlah sebenarnya saya mendapat regex kode warna saja. Tetapi menginstal seluruh modul hanya untuk satu regex itu agak banyak.
cjm
4
Ya, jika Anda mengatur cpanm dengan benar, itu menginstal modul dalam waktu sekitar 5 detik.
Ryan Thompson
Tidak perlu menulis skrip ke file. Hanya pipa ke:perl -mTerm::ANSIColor=colorstrip -n -e 'print colorstrip $_'
Jesse Glick
10

Jika sistem Anda memiliki akses ke NodeJS, Anda dapat menginstal paket Node berikut strip-ansi-cli,.

$ npm install -g strip-ansi-cli

Anda kemudian dapat menjalankan perintah Anda seperti ini:

$ command-that-produces-colored-output | strip-ansi > outfile
David McNamara
sumber
1
NodeJS adalah ketergantungan besar, ketika ada solusi yang dapat menggunakan bahasa dan alat yang sudah ada di sebagian besar sistem.
user137369
Juga, ini adalah solusi paling lambat yang terdaftar (lihat di sini ) dan Anda mungkin akan melihat perbedaannya.
3

Perintah sed ini melakukannya untuk saya:

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

Contoh:

$ command-that-produces-colored-output | sed -r "s/\\^\\[(\\[[^@-~]+[@-~]|[0-9@-_]|%@)//g" > outfile
Ben
sumber
Ini sepertinya tidak berfungsi dengan versi terbaru dari sed.
3

Anda dapat menggunakan ac untuk ini. Itu harus lebih cepat daripada apa pun yang tercantum di atas (meskipun perldan sedharus layak). Ini sebuah contoh:

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

Sebagai penafian: fungsi pemfilteran warna ditulis oleh saya.


sumber
3
tautan ke 'ac' akan sangat membantu. ;)
Vitaly Kushner
The acProgram tampaknya berada di sini: hub.darcs.net/vmchale/fastcat
Michael Burr
1
$ command-that-produces-colored-output | ansifilter

... dan jika perlu, (dnf, ...) install ansifilter

Joao
sumber