A ideia de um script sed está bem (e há vários scripts disponíveis para este propósito), mas o script sugerido poderia ser melhorado:
- esse fragmento
s/\x1b_[^\x1b]*\x1b[\]//g
pode ser usado para filtrar o modo de aplicativo comandos . No entanto, é improvável que o leitor encontre esses usados , conforme observado na documentação do xterm:
APC
Pt ST
None. xterm implements no APC functions; Pt is ignored. Pt need not be printable characters.
- se o sublinhado fosse alterado para um colchete quadrado direito
]
, então isso corresponderia a algum controles do sistema operacional . Novamente, no entanto, o principal uso daqueles nos terminais usa a terminação variante com BEL
7
(ASCII sed
) para títulos no estilo xterm (geralmente usados em strings de prompt do bash / zsh).
Dadas essas considerações, uma primeira parte melhor pode ser uma correspondência não-gulosa para escape \ ou BEL . Mas m
faz combinações gananciosas. Em vez de ficar complicado, apenas
s/\x1b\][^\x07]*\x07//g
deve ser suficiente.
O outro pedaço também tem um problema. É muito ganancioso desde o início:
s/\x1B\[[^m]*m//g
porque supõe que depois de se livrar dos comandos do modo aplicativo (ou sistema operacional), as únicas seqüências de escape restantes na saída do shell serão aquelas que alteram os modos de vídeo, isto é, SGR (terminando com %code% ). Com uma ligeira mudança, a expressão filtraria apenas as sequências SGR, e não se empolgaria e removeria tudo começando com um escape [, por exemplo,
s/\x1B\[[;0-9]*m//g
A filtragem de seqüências de escape color pode ser considerada um caso especial na filtragem da saída de terminal para texto simples, conforme respondido em posso programaticamente" gravar em "códigos de controle ANSI para um arquivo usando unix utilidades? uma semana antes desta pergunta ser feita.
Leitura adicional: