Les caractères ^[[37m
et ^[[0m
font partie des séquences d'échappement ANSI (codes CSI) . Voir aussi ces spécifications .
Utiliser GNU sed
sed 's/\x1b\[[0-9;]*m//g'
\x1b
(ou \x1B
) est le caractère spécial d' échappement
( sed
ne prend pas en charge les alternatives \e
et \033
)
\[
est le deuxième caractère de la séquence d'échappement
[0-9;]*
est la valeur de couleur regex
m
est le dernier caractère de la séquence d'échappement
Sur macOS, la sed
commande par défaut ne prend pas en charge les caractères spéciaux tels \e
que ceux signalés par slm et 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 OP: (OP signifie affiche originale)
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
propre à la séquence d'échappement en mode graphique (couleur). Mais [a-zA-Z]
peut être trop large et pourrait enlever trop. Michał Faleński et Miguel Mota proposent de ne supprimer que certaines séquences d'échappement avec [mGKH]
et [mGKF]
respectivement. Britton Kerin indique qu'il K
faut également utiliser en plus de m
supprimer les couleurs d' gcc
erreur / avertissement (n'oubliez pas de rediriger 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
En utilisant perl
La version de sed
installée sur certains systèmes d'exploitation peut être limitée (par exemple, macOS). La commande perl
a l'avantage d'être généralement plus facile à installer / mettre à jour sur plusieurs systèmes d'exploitation. Adam Katz suggère d'utiliser \e
(idem \x1b
) dans 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 OP:
perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' \
| perl -pe 's/\e\[[0-9;]*m//g'
Usage
Comme le souligne le commentaire de Stuart Cardall , cette sed
ligne de commande est utilisée par le projet Ultimate Nginx Bad Bot (1 000 étoiles) pour nettoyer le rapport de courrier électronique ;-)
more
ou pourless -R
interpréter les codes d'échappement sous forme de couleur au lieu d'un éditeur de texte.