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

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


当前回答

我无法从其他答案中得到满意的结果,但下面的答案对我来说很有用:

somescript | sed -r "s/[[:cntrl:]]\[[0-9]{1,3}m//g"

如果我只删除了控制字符“^[”,它就会留下其余的颜色数据,例如“33m”。加上颜色代码和“m”就成功了。我对s/\x1B//g不工作感到困惑,因为\x1B[31m当然可以与echo一起工作。

其他回答

不确定./somescript中有什么,但如果转义序列没有硬编码,您可以设置终端类型来避免它们

TERM=dumb ./somescript 

例如,如果你尝试

TERM=dumb tput sgr0 | xxd

您将看到它在while时没有输出

tput sgr0 | xxd
00000000: 1b28 421b 5b6d                           .(B.[m

Does(对于xterm-256color)。

我无法从其他答案中得到满意的结果,但下面的答案对我来说很有用:

somescript | sed -r "s/[[:cntrl:]]\[[0-9]{1,3}m//g"

如果我只删除了控制字符“^[”,它就会留下其余的颜色数据,例如“33m”。加上颜色代码和“m”就成功了。我对s/\x1B//g不工作感到困惑,因为\x1B[31m当然可以与echo一起工作。

这对我来说很管用:

./somescript | cat

我在Debian的有色日志包中遇到了ansi2txt工具。该工具删除来自STDIN的ANSI控制代码。

使用的例子:

./somescript | ansi2txt

源代码http://github.com/kilobyte/colorized-logs

在纯Bash中更简单的函数从文本流中过滤出常见的ANSI代码:

# Strips common ANSI codes from a text stream

shopt -s extglob # Enable Bash Extended Globbing expressions
ansi_filter() {
  local line
  local IFS=
  while read -r line || [[ "$line" ]]; do
    printf '%s\n' "${line//$'\e'[\[(]*([0-9;])[@-n]/}"
  done
}

See:

扩展Globbing gnu.org: Bash参数扩展