140 votes

Suppression des codes couleur ANSI du flux de texte

En examinant la sortie de

perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";'

dans un éditeur de texte (par exemple, vi ) montre ce qui suit :

^[[37mABC
^[[0m

Comment supprimer les codes couleur ANSI du fichier de sortie ? Je suppose que la meilleure façon serait de faire passer la sortie par une sorte d'éditeur de flux.

Ce qui suit ne fonctionne pas

perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' | perl -pe 's/\^\[\[37m//g' | perl -pe 's/\^\[\[0m//g'

194voto

oHo Points 2423

Les personnages ^[[37m y ^[[0m font partie de la Séquences d'échappement ANSI (codes CSI) .  Voir aussi ces spécifications .

Utilisation de GNU sed

sed 's/\x1b\[[0-9;]*m//g'
  • \x1b (ou \x1B ) est le s'échapper caractère spécial
    ( sed ne supporte pas les alternatives \e y \033 )
  • \[ est le deuxième caractère de la séquence d'échappement
  • [0-9;]* est la regex de la ou des valeurs de couleur
  • m est le dernier caractère de la séquence d'échappement

Sous macOS, la valeur par défaut sed ne prend pas en charge les caractères spéciaux tels que \e comme l'a souligné slm y steamer25 dans les commentaires. Utilisez plutôt gsed que vous pouvez installer en utilisant brew install gnu-sed .

Exemple avec la ligne de commande de l'OP :   (OP signifie Original Poster)

perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' | 
      sed 's/\x1b\[[0-9;]*m//g'

Tom Hale suggère de supprimer toutes les autres séquences d'échappement en utilisant [a-zA-Z] au lieu de la lettre m spécifique à la séquence d'échappement du mode graphique (couleur). Mais [a-zA-Z] peut être trop large et pourrait enlever trop de choses. Micha Faleski y Miguel Mota proposer de supprimer uniquement certaines séquences d'échappement en utilisant [mGKH] y [mGKF] respectivement. Britton Kerin indique K doit également être utilisé en plus de m pour enlever les couleurs de gcc erreur/alerte (n'oubliez pas de rediriger l'information vers la page d'accueil) gcc 2>&1 | sed... ).

sed 's/\x1b\[[0-9;]*m//g'           # Remove color sequences only
sed 's/\x1b\[[0-9;]*[a-zA-Z]//g'    # Remove all escape sequences
sed 's/\x1b\[[0-9;]*[mGKH]//g'      # Remove color and move sequences
sed 's/\x1b\[[0-9;]*[mGKF]//g'      # Remove color and move sequences

Last escape
sequence
character   Purpose
---------   -------------------------------
m           Graphics Rendition Mode (including Color)
G           Horizontal cursor move
K           Horizontal deletion
H           New cursor position
F           Move cursor to previous n lines

Utilisation de perl

La version de sed installé sur certains systèmes d'exploitation peut être limité (par exemple, macOS). La commande perl a l'avantage d'être généralement plus facile à installer/mettre à jour sur un plus grand nombre de systèmes d'exploitation. Adam Katz suggère d'utiliser \e (même chose que \x1b ) en PCRE .

Choisissez votre regex en fonction du nombre de commandes que vous souhaitez filtrer :

perl -pe 's/\e\[[0-9;]*m//g'          # Remove colors only
perl -pe 's/\e\[[0-9;]*[mG]//g'
perl -pe 's/\e\[[0-9;]*[mGKH]//g'
perl -pe 's/\e\[[0-9;]*[a-zA-Z]//g'
perl -pe 's/\e\[[0-9;]*m(?:\e\[K)?//g' # Adam Katz's trick

Exemple avec la ligne de commande de l'OP :

perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' \
      | perl -pe 's/\e\[[0-9;]*m//g'

Utilisation

Comme l'a souligné Stuart Cardall Le commentaire de l'auteur, cette sed La ligne de commande est utilisée par le projet Ultimate Nginx Bad Bot (1000 étoiles) pour nettoyer le rapport d'email ;-)

35voto

user204331 Points 341

J'ai trouvé une meilleure façon de supprimer les séquences d'échappement si vous utilisez MacOS. Regardez ça :

perl -pe 's/\x1b\[[0-9;]*[mG]//g'

13voto

BrianCooksey Points 425

Ansi2txt

https://unix.stackexchange.com/a/527259/116915

cat typescript | ansi2txt | col -b
  • ansi2txt : supprimer les codes de couleur ANSI
  • col -b : enlever ^H o ^M

mise à jour : le col gère les tabulations et les espaces // mentionné par @DanielF

. environ col gérer les espaces et les tabulations

col -bx remplacer \t ' à ' ', col -bh remplacer ' ' par ' \t '.

// semble col ne peut pas garder les espaces/tabulations tels quels, c'est dommage.

0. chaîne d'origine

$ echo -e '        ff\tww' | hd
00000000  20 20 20 20 20 20 20 20  66 66 09 77 77 0a        |        ff.ww.|

1. -h remplace les espaces par des tabulations

$ echo -e '        ff\tww' | col -b | hd
00000000  09 66 66 09 77 77 0a                              |.ff.ww.|
$ echo -e '        ff\tww' | col -bh | hd
00000000  09 66 66 09 77 77 0a                              |.ff.ww.|
$ echo -e '        ff\tww' | col -bxh | hd
00000000  09 66 66 09 77 77 0a                              |.ff.ww.|

2. -x remplacer les tabulations par des espaces

$ echo -e '        ff\tww' | col -bx | hd
00000000  20 20 20 20 20 20 20 20  66 66 20 20 20 20 20 20  |        ff      |
00000010  77 77 0a                                          |ww.|
$ echo -e '        ff\tww' | col -bhx | hd
00000000  20 20 20 20 20 20 20 20  66 66 20 20 20 20 20 20  |        ff      |
00000010  77 77 0a                                          |ww.|

3. semble col ne peut pas garder les espaces et les tabulations comme c'est le cas.

12voto

James Mertz Points 390

Ce qui est affiché comme ^[ es pas ^ y [ ; c'est l'ASCII ESC personnage, produit par Esc o Ctrl[ (le ^ signifie la touche Ctrl).

ESC est 0x1B hexadécimal ou 033 octal, donc vous devez utiliser \x1B o \033 dans vos regex :

perl -pe 's/\033\[37m//g; s/\033[0m//g'

perl -pe 's/\033\[\d*(;\d*)*m//g'

11voto

Sindre Sorhus Points 420

Si vous préférez quelque chose de plus simple, vous pouvez utiliser mes strip-ansi-cli paquet ( Node.js nécessaire) :

$ npm install --global strip-ansi-cli

Alors utilisez-le comme ceci :

$ strip-ansi < colors.o

Ou simplement passer dans une chaîne :

$ strip-ansi '^[[37mABC^[[0m'

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X