Question: I have some script that produces output with colors and I need to remove the ANSI codes.

```
#!/bin/bash

exec > >(tee log)   # redirect the output to a file but keep it on stdout
exec 2>&1

./somescript

```

The output is (in log file):

```
java (pid  12321) is running...@[60G[@[0;32m  OK  @[0;39m]

```

I didn't know how to put the ESC character here, so I put `@` in its place.

I changed the script into:

```
#!/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"

```

But now it gives me (in log file):

```
java (pid  12321) is running...@[60G[  OK  ]

```

How can I also remove this '`@[60G`?

Maybe there is a way to completely disable coloring for the entire script?

Answer: 
[According to Wikipedia](http://en.wikipedia.org/wiki/ANSI_escape_code), the `[m|K]` in the `sed` command you're using is specifically designed to handle `m` (the color command) and `K` (the "erase part of line" command). Your script is trying to set absolute cursor position to 60 (`^[[60G`) to get all the OKs in a line, which your `sed` line doesn't cover.

(Properly, `[m|K]` should probably be `(m|K)` or `[mK]`, because you're not trying to match a pipe character. But that's not important right now.)

If you switch that final match in your command to `[mGK]` or `(m|G|K)`, you should be able to catch that extra control sequence.

```
./somescript | sed -r "s/\x1B\[([0-9]{1,3}(;[0-9]{1,2};?)?)?[mGK]//g"

```
my contribution:

```
./somescript | sed -r "s/\\x1B[\\x5d\[]([0-9]{1,3}(;[0-9]{1,3})?(;[0-9]{1,3})?)?[mGK]?//g"

```