我有一些脚本,产生输出的颜色,我需要删除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?

也许有一种方法可以完全禁用整个脚本的着色?


当前回答

有争议的想法是重新配置该进程环境的终端设置,让进程知道终端不支持颜色。

我想到了像TERM=xterm-mono ./somescript这样的东西。YMMV与您特定的操作系统和脚本理解终端颜色设置的能力。

其他回答

我使用perl,因为我必须经常在许多文件上这样做。这将遍历所有文件名为*.txt的文件,并删除任何格式。这适用于我的用例,可能对其他人也有用,所以只是想在这里发帖。替换文件名*.txt,或者你可以在设置下面的filename变量时用空格分隔文件名。

$ FILENAME=$(ls filename*.txt) ; for file in $(echo $FILENAME); do echo $file; cat $file | perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' | col -b > $file-new; mv $file-new $file; done

有争议的想法是重新配置该进程环境的终端设置,让进程知道终端不支持颜色。

我想到了像TERM=xterm-mono ./somescript这样的东西。YMMV与您特定的操作系统和脚本理解终端颜色设置的能力。

我有一些彩色输出的问题,其他解决方案在这里没有正确处理,所以我建立了这个perl一行。它查找转义\e,后面跟着开括号\[,后面跟着1或颜色代码\d+,以分号分隔,以m结尾。

perl -ple 's/\e\[\d+(;\d+)*m//g'

对于彩色编译器输出,它似乎工作得非常好。

嗯,不确定这是否为你工作,但'tr'将'剥离'(删除)控制代码-尝试:

./somescript | tr -d '[:cntrl:]'

我也遇到过类似的问题。我发现的所有解决方案都适用于颜色代码,但没有删除“$(tput sgr0)”添加的字符(重置属性)。

以davemyron注释中的解决方案为例,在下面的例子中,结果字符串的长度是9,而不是6:

#!/usr/bin/env bash

string="$(tput setaf 9)foobar$(tput sgr0)"
string_sed="$( sed -r "s/\x1B\[[0-9;]*[JKmsu]//g" <<< "${string}" )"
echo ${#string_sed}

为了正常工作,regex必须扩展以匹配由sgr0 ("\E(B"))添加的序列:

string_sed="$( sed -r "s/\x1B(\[[0-9;]*[JKmsu]|\(B)//g" <<< "${string}" )"