Звучит проще с perl
:
perl -0777 -pe '
BEGIN{
%c = (
"38;5;40" => "Green",
"38;5;196" => "Red",
"38;5;75" => "Blue",
"38;5;166" => "Sienna",
"38;5;231" => "DarkSlateGray",
"38;5;40" => "Green",
"38;5;196" => "Red",
"38;5;75" => "Blue",
"38;5;166" => "Sienna",
"38;5;231" => "DarkSlateGray",
"0" => "Black");
$esc = qr{\e\[([\d;]*)m};
}
s{$esc(.*?)(?=$|$esc)}{
$ret = $2;
if ($2 ne "" && $1 ne $last) {
$ret = (defined($last) && "[/COLOR]") . "[COLOR=\"$c{$1}\"]$2";
$last = $1
}
$ret
}gse;
s{$}{[/COLOR]} if $last'
(здесь используется ленивый подход и загрузка всего файла в память.