O script a seguir deve filtrar todas as sequências de controle ANSI / VT100 / xterm para (com base em ctlseqs ). Minimamente testado, por favor relate qualquer sub ou over-match.
#!/usr/bin/env perl
## uncolor — remove terminal escape sequences such as color changes
while (<>) {
s/ \e[ #%()*+\-.\/]. |
\e\[ [ -?]* [@-~] | # CSI ... Cmd
\e\] .*? (?:\e\|[\a\x9c]) | # OSC ... (ST|BEL)
\e[P^_] .*? (?:\e\|\x9c) | # (DCS|PM|APC) ... ST
\e. //xg;
print;
}
Problemas conhecidos:
- Não reclama de sequências malformadas. Não é para isso que este roteiro é.
- Argumentos de cadeia de várias linhas para DCS / PM / APC / OSC não são suportados.
- Bytes no intervalo de 128 a 159 podem ser analisados como caracteres de controle, embora isso raramente seja usado. Aqui está uma versão que analisa os caracteres de controle não-ASCII (isso irá manchar o texto não-ASCII em algumas codificações, incluindo UTF-8).
#!/usr/bin/env perl
## uncolor — remove terminal escape sequences such as color changes
while (<>) {
s/ \e[ #%()*+\-.\/]. |
(?:\e\[|\x9b) [ -?]* [@-~] | # CSI ... Cmd
(?:\e\]|\x9d) .*? (?:\e\|[\a\x9c]) | # OSC ... (ST|BEL)
(?:\e[P^_]|[\x90\x9e\x9f]) .*? (?:\e\|\x9c) | # (DCS|PM|APC) ... ST
\e.|[\x80-\x9f] //xg;
print;
}