如何从标准输出中剥离颜色代码并传递到文件和标准输出


14

我有一个混合使用printf某些程序的程序,tput我想将输出通过管道输出到stdout以及一个文件。我宁愿使用它,sed因为我不想对脚本有任何不必要的依赖。这是到目前为止我得到的。

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

唯一的问题是我的日志文件正在获取所有颜色输出...

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

我希望它只有 | Sourcing files...



@StephaneChazelas,我现在暂时不使用任何perl脚本,甚至这些sed选项似乎也不起作用。
iamnewton 2014年

Answers:


12

根据从输出中去除颜色,您的命令应为:

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"

为了方便起见,您还可以在中创建别名 /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"'

[编辑]

使用给定的输出,您可以自己检查:

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

输出:

$ 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
-r标志在Mac BSD上似乎不起作用,因此我尝试使用的标志-E似乎与之最相似,并且仍在日志文件中输出, ^[36m| ^[(B^[[m^[[37mSourcing files...^[[m 就像| ^[(BSourcing files...在我的Linux机器上一样。
iamnewton

请向我们显示通过管道传输的打印cmd的输出|xxd和您的环境TERM。变种

TERM=> xterm0000000: 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 2014年

1
它仍然审核了我相同的结果,除了我必须更改stripcolors功能,因为Mac OS X无法理解-rsed命令的选项。我假设您正在使用某种Linux发行版?
iamnewton 2014年

3
不幸的是,这并没有在OS X上运行
豪尔赫Bucaran
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.