我有一些脚本,产生输出的颜色,我需要删除ANSI代码。
#!/bin/bash
exec > >(tee log) # redirect the output to a file but keep it on stdout
exec 2>&1
./somescript
输出为(在日志文件中):
java (pid 12321) is running...@[60G[@[0;32m OK @[0;39m]
我不知道如何在这里放置ESC字符,所以我把@放在它的位置。
我把剧本改成:
#!/bin/bash
exec > >(tee log) # redirect the output to a file but keep it on stdout
exec 2>&1
./somescript | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
但是现在它给了我(在日志文件中):
java (pid 12321) is running...@[60G[ OK ]
我怎么也可以删除这个'@[60G?
也许有一种方法可以完全禁用整个脚本的着色?
@jeff-bowman的解决方案帮助我摆脱了一些颜色代码。
我在正则表达式中添加了另一小部分,以便删除更多:
sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" # Original. Removed Red ([31;40m[1m[error][0m)
sed -r "s/\x1B\[([0-9];)?([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" # With an addition, removed yellow and green ([1;33;40m[1m[warning][0m and [1;32;40m[1m[ok][0m)
^^^^^^^^^
remove Yellow and Green (and maybe more colors)
恕我直言,大多数答案都过于努力地限制转义代码中的内容。结果,它们最终会丢失常见的代码,如[38;5;60m(前景色ANSI颜色60来自256色模式)。
它们还需要启用GNU扩展的-r选项。这些都不是必需的;它们只是让正则表达式读起来更好。
下面是一个更简单的答案,它处理256色转义,并在非gnu sed系统上工作:
./somescript | sed 's/\x1B\[[0-9;]\{1,\}[A-Za-z]//g'
这将捕获以[开头,有任意数量的小数和分号,并以字母结尾的任何内容。这应该捕获任何常见的ANSI转义序列。
对于所有可能的ANSI转义序列,这里有一个更大、更通用(但最少测试)的解决方案:
./somescript | sed 's/\x1B[@A-Z\\\]^_]\|\x1B\[[0-9:;<=>?]*[-!"#$%&'"'"'()*+,.\/]*[][\\@A-Z^_`a-z{|}~]//g'
(如果你有@edi9999的SI问题,在后面加上| sed "s/\x0f//g";这适用于任何控制字符,用不需要的字符的十六进制替换0f)
根据维基百科的说法,您正在使用的sed命令中的[m|K]是专门用于处理m(颜色命令)和K(“擦除行部分”命令)的。您的脚本试图将光标的绝对位置设置为60 (^[[60G),以获得一行中的所有ok,这是sed行没有覆盖的。
正确地,[m|K]应该是(m|K)或[mK],因为您并没有试图匹配一个管道字符。但现在这并不重要。)
如果您将命令中的最终匹配转换为[mGK]或(m|G|K),您应该能够捕获额外的控制序列。
./somescript | sed -r "s/\x1B\[([0-9]{1,3}(;[0-9]{1,2};?)?)?[mGK]//g"