So entfernen Sie Farbcodes aus stdout und leiten sie in Datei und stdout um

14

Ich habe ein Programm, das printfmit einigem darin tputgemischt verwendet, und ich möchte die Ausgabe zu stdout sowie zu einer Akte leiten. Ich würde es vorziehen, zu verwenden, sedda ich keine unnötigen Abhängigkeiten von meinem Skript haben möchte. Folgendes habe ich bisher.

printf "\n$(tput setaf 6)| $(tput sgr0)$(tput setaf 7)Sourcing files...\033[m\n" | tee install.log

Das einzige Problem dabei ist, dass meine Protokolldatei die gesamte Farbausgabe als solche erhält ...

^[[36m| ^[(B^[[m^[[37mSourcing files...^[[m

Ich hätte es gerne einfach | Sourcing files...

Iamnewton
quelle
1
Siehe unix.stackexchange.com/q/14684/22565
Stéphane Chazelas,
@StephaneChazelas, ich versuche im Moment, keines der Perl-Skripte zu verwenden, und selbst die sedOptionen scheinen nicht zu funktionieren.
Iamnewton

Antworten:

12

Entsprechend dem Entfernen von Farben aus der Ausgabe sollte Ihr Befehl folgendermaßen lauten:

printf "\n$(tput setaf 6)| $(tput sgr0)$(tput setaf 7)Sourcing files...\033[m\n" |\
sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" |tee install.log
w/o "-r"
sed "s/\x1B\[\([0-9]\{1,2\}\(;[0-9]\{1,2\}\)\?\)\?[mGK]//g"

Aus praktischen Gründen können Sie auch einen Alias ​​in erstellen /etc/profile

alias stripcolors='sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g"'
w/o '-r'
alias stripcolors='sed "s/\x1B\[\([0-9]\{1,2\}\(;[0-9]\{1,2\}\)\?\)\?[mGK]//g"'

[Bearbeiten]

Mit der angegebenen Ausgabe können Sie dies selbst überprüfen:

#!/usr/bin/perl

while ($line=<DATA>) {
    $line =~ s/^[0-9a-f]+: //;
    while ($line =~ s/([0-9a-f]{2})(?=[0-9a-f]{2}| )//) {
      print chr(hex($1));
    }
}
__DATA__
0000000: 1b5b 316d 1b5b 3333 6de2 9aa0 2020 5761 .[1m.[33m... Wa
0000010: 726e 696e 673a 201b 2842 1b5b 6d4e 6f20 rning: .(B.[mNo
0000020: 2f55 7365 7273 2f61 7077 2f2e 6261 7368 /Users/apw/.bash
0000030: 2066 6f75 6e64 2e21 0a found.!.

Die Ausgabe:

$ perl checkerbunny|xxd
0000000: 1b5b 316d 1b5b 3333 6de2 9aa0 2020 5761  .[1m.[33m...  Wa
0000010: 726e 696e 673a 201b 2842 1b5b 6d4e 6f20  rning: .(B.[mNo 
0000020: 2f55 7365 7273 2f61 7077 2f2e 6261 7368  /Users/apw/.bash
0000030: 2066 6f75 6e64 2e21 0a                    found.!.

$ perl checkerbunny|stripcolors|xxd
0000000: e29a a020 2057 6172 6e69 6e67 3a20 1b28  ...  Warning: .(
0000010: 424e 6f20 2f55 7365 7273 2f61 7077 2f2e  BNo /Users/apw/.
0000020: 6261 7368 2066 6f75 6e64 2e21 0a         bash found.!.
Gemeinschaft
quelle
1
Das -rFlag scheint auf Mac BSD nicht zu funktionieren, daher -Escheint es mir am ähnlichsten zu sein, und es wird immer noch als solches in der Protokolldatei ausgegeben. ^[36m| ^[(B^[[m^[[37mSourcing files...^[[m Es wird auch wie | ^[(BSourcing files...auf meiner Linux-Box zurückgegeben.
Iamnewton
Bitte zeigen Sie uns die Ausgabe Ihres gedruckten cmd |xxdund Ihr TERMenv. var.
TERM=> xterm. 0000000: 1b5b 316d 1b5b 3333 6de2 9aa0 2020 5761 .[1m.[33m... Wa 0000010: 726e 696e 673a 201b 2842 1b5b 6d4e 6f20 rning: .(B.[mNo 0000020: 2f55 7365 7273 2f61 7077 2f2e 6261 7368 /Users/apw/.bash 0000030: 2066 6f75 6e64 2e21 0a found.!.
Iamnewton
1
Es führt immer noch zu den gleichen Ergebnissen, außer dass ich die stripcolorsFunktion ändern muss , da Mac OS X die -rOption für den sedBefehl nicht versteht . Ich nehme an, Sie sind in einer Art Linux-Distribution?
Iamnewton
3
Leider ist dies nicht funktioniert auf OS X.
Jorge Bucarán