Cara menghapus kode warna dari stdout dan pipa ke file dan stdout


14

Saya punya program yang menggunakan printfdengan beberapa tputcampuran di dalamnya dan saya ingin menyalurkan output ke stdout serta file. Saya lebih suka menggunakan sedkarena saya tidak ingin ada ketergantungan yang tidak perlu pada skrip saya. Inilah yang saya dapatkan sejauh ini.

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

Satu-satunya masalah dengan ini adalah file log saya mendapatkan semua output warna seperti ...

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

Saya ingin hanya memilikinya | Sourcing files...



@StephaneChazelas, saya mencoba untuk tidak menggunakan skrip perl apa pun untuk saat ini, dan bahkan sedopsi tampaknya tidak berfungsi.
iamnewton

Jawaban:


12

Menurut menghapus warna dari output , perintah Anda harus:

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"

Untuk alasan kenyamanan Anda juga bisa membuat alias di /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"'

[Sunting]

Dengan output yang diberikan Anda dapat memeriksa ini sendiri:

#!/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.!.

Hasil:

$ 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.!.

1
yang -rbendera tidak muncul untuk bekerja pada Mac BSD, jadi saya mencoba menggunakan -Eakan tampaknya menjadi yang paling mirip dan itu masih keluaran dalam file log seperti ... ^[36m| ^[(B^[[m^[[37mSourcing files...^[[m Hal ini juga dilengkapi kembali seperti | ^[(BSourcing files...pada kotak Linux saya.
iamnewton

tolong tunjukkan kami hasil cetak cmd Anda yang disalurkan dengan |xxddan TERMenv Anda . 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
masih memberi saya hasil yang sama, kecuali bahwa saya harus mengubah stripcolorsfungsinya karena Mac OS X tidak mengerti -ropsi untuk sedperintah. Saya berasumsi Anda menggunakan distro Linux?
iamnewton

3
Sayangnya, ini tidak berfungsi pada OS X.
Jorge Bucaran
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.