Program, który przekazuje STDIN do STDOUT z usuniętymi kodami kolorów?


64

Mam polecenie, które generuje dane wyjściowe w kolorze, i chciałbym przesłać je do pliku z usuniętymi kodami kolorów. Czy istnieje takie polecenie, które działa tak cat, że usuwa kody kolorów? Planuję zrobić coś takiego:

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

4
Może to być błąd, w wyniku którego program generuje kolorowe dane wyjściowe, nawet jeśli dane wyjściowe są przekierowywane do pliku i nie zapewnia opcji wyłączenia go. Spodziewałbym się, że każdy program, który pokoloruje jego wyjście, sprawdzi isatty(stdin)przedtem. Chcesz podzielić się tym, czym jest ten program?
— alex

przekazać go cat- szybki test, który przeprowadziłem, grep --color=auto myusername /etc/passwddaje mi moją nazwę użytkownika w kolorze czerwonym z białym tekstem w innym przypadku. grep --color=auto myusername /etc/passwd | catdaje mi zwykły biały tekst
— ivanivan

1
To nie jest rozwiązanie. Działa to tylko dlatego, że grep --color=autopozwala uniknąć tworzenia kolorowych wydruków, gdy standardowe wyjście nie jest terminalem. Mówię o poleceniu, które bezwarunkowo wyświetla kody kolorów. (Jak podkreśla Alex powyżej, takie zachowanie jest prawdopodobnie błędem, ale czasami musimy pracować z niedoskonałym oprogramowaniem, którego sami nie jesteśmy w stanie łatwo naprawić, i o to właśnie chodzi.)
— Ryan Thompson

Odpowiedzi:


59

Można by pomyśleć, że byłoby na to narzędzie, ale nie mogłem go znaleźć. Jednak ten liniowiec Perl powinien załatwić sprawę:

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

Przykład:

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

Lub, jeśli chcesz skrypt, możesz zapisać jako stripcolorcodes:

#! /usr/bin/perl

use strict;
use warnings;

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

Jeśli chcesz usunąć tylko kody kolorów i pozostawić wszystkie inne kody ANSI (np. Ruch kursora) w spokoju, użyj

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

zamiast podstawienia, którego użyłem powyżej (który usuwa wszystkie kody specjalne ANSI).


9
Jak wspomniano w komentarzu do innej odpowiedzi ( unix.stackexchange.com/questions/4527/… ), ten regex został pobranyTerm::ANSIColor . Podaj swoje źródła, proszę!
— forivall

2
potwierdź swoje źródła!
— Jürgen Paul

29

Usuń kody kolorów (znaki specjalne) za pomocą GNU sed

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

Lub

Usuń sekwencje specjalne ANSI w Pythonie

Zainstaluj pakiet colorama python ( pip install colorama). Umieść w stripcolorcodes:

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

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

Uruchom chmod +x stripcolorcodes.


To jest niesamowite. Dokładnie to, czego potrzebowałem!
— adivis12

Python jest nieco powolny, ale sedrobi wrażenie :)

2
Nie próbowałem Pythona, ale wersja sed nie usuwa wszystkich kolorów. (Nie testowałem wyczerpująco, ale pozostawiło kilka kolorów tła nietkniętych, więc wybrałem opcję szybszego perla.)
— rsaw 17.01.2018

22

Jeśli możesz zainstalować moduł Term :: ANSIColor , ten skrypt perla działa:

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

5
Właśnie tam mam regex oparty tylko na kodach kolorów. Ale instalacja całego modułu tylko dla tego jednego wyrażenia regularnego to trochę więcej.
— cjm

4
Meh, jeśli poprawnie skonfigurujesz cpanm, zainstaluje moduł w około 5 sekund.
— Ryan Thompson,

Nie ma potrzeby zapisywania skryptu w pliku. Po prostu podłącz do:perl -mTerm::ANSIColor=colorstrip -n -e 'print colorstrip $_'
— Jesse Glick

10

Jeśli system ma dostęp do NodeJS można zainstalować następujący pakiet węźle strip-ansi-cli.

$ npm install -g strip-ansi-cli

Następnie możesz uruchomić polecenie tak:

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

1
NodeJS jest ogromną zależnością, gdy istnieją rozwiązania, które mogą wykorzystywać języki i narzędzia już obecne w większości systemów.
— user137369,

Ponadto, jest to najwolniejszy rozwiązanie wymienione (patrz tutaj ) i prawdopodobnie będzie zauważyć różnicę.

3

To polecenie sed zrobiło to dla mnie:

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

Przykład:

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

To nie wydaje się działać z najnowszą wersją sed.

3

Możesz do tego użyć ac . Powinno być szybsze niż cokolwiek wymienionego powyżej (choć perli sedpowinno być przyzwoite). Oto przykład:

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

Jako wyłączenie odpowiedzialności: funkcja filtrowania kolorów została napisana przeze mnie.


3
link do „ac” byłby pomocny. ;)
— Witalij Kushner,

acProgram wydaje się być tutaj: hub.darcs.net/vmchale/fastcat
— Michael Burr

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

... a jeśli to konieczne, (dnf, ...) install ansifilter

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.