I want to output a command's results to both the console and a file. For that, I use tee
. But I would also like to remove the ESC character from the file and not from the console output because it removes the colouring.
I have tried using sed -e 's/\x1b\[[0-9;]*m//g'
, which removes the colouring and ESC from both.
1 Answer
I would probably capture the file and then, when it's done, post-process the file to remove the unwanted characters.
If you need to do it on the fly, and if you use a shell with process substitutions (>(...)
), then you could use one of these to filter the file output of tee
:
some-command | tee >( sed -e 's/\x1b[[0-9;]m//g' >file )
Assuming some-command
still outputs coloured text when it's not connected to a terminal, this would filter the output through your sed
command before passing the modified output on to the file called file
. The unmodified output of some-command
is also passed to the standard output of tee
as expected.
Without process substitutions, this could be with sed
alone like so:
some-command | sed -n -e p -e 's/\x1b[[0-9;]m//g' -e 'w file'
This uses sed
to output the unmodified line to standard output (with p
) and then modifies with your substitution expression. In the end, the modified line is written to file
with the w
command. The default output of the modified line at the end of the editing script is turned off with -n
.