Làm cách nào để tách mã màu ra khỏi thiết bị xuất chuẩn và đường ống vào tệp và thiết bị xuất chuẩn


14

Tôi có một chương trình sử dụng printfvới một số tputhỗn hợp trong đó và tôi muốn chuyển đầu ra ra thiết bị xuất chuẩn cũng như một tệp. Tôi muốn sử dụng sedvì tôi không muốn bất kỳ sự phụ thuộc không cần thiết nào vào kịch bản của mình. Đây là những gì tôi đã có cho đến nay.

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

Vấn đề duy nhất với điều này là tệp nhật ký của tôi có được tất cả các đầu ra màu như vậy ...

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

Tôi muốn nó chỉ có | Sourcing files...



@StephaneChazelas, hiện tôi đang cố gắng không sử dụng bất kỳ tập lệnh perl nào và thậm chí các sedtùy chọn dường như không hoạt động.
iamnewton

Câu trả lời:


12

Theo việc loại bỏ màu khỏi đầu ra , lệnh của bạn phải là:

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"

Vì lý do thuận tiện, bạn cũng có thể tạo một bí danh trong /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"'

[Biên tập]

Với đầu ra đã cho, bạn có thể tự kiểm tra điều này:

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

Đầu ra:

$ 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
các -rlá cờ không xuất hiện để làm việc trên Mac BSD, vì vậy tôi cố gắng sử dụng -Esẽ có vẻ là giống nhất và nó vẫn xuất ra trong file log như vậy ... ^[36m| ^[(B^[[m^[[37mSourcing files...^[[m Nó cũng trở lại như | ^[(BSourcing files...trên hộp Linux của tôi.
iamnewton

vui lòng cho chúng tôi biết đầu ra của cmd in của bạn được in |xxdTERMenv của bạn . 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
nó vẫn cho tôi kết quả tương tự, ngoại trừ việc tôi phải thay đổi stripcolorschức năng vì Mac OS X không hiểu -rtùy chọn cho sedlệnh. Tôi đang giả sử bạn đang sử dụng một số bản phân phối Linux?
iamnewton

3
Thật không may, điều này không hoạt động trên OS X.
Jorge Bucaran
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.