Examiner les résultats de
perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";'
dans un éditeur de texte (par exemple, vi
) affiche les éléments suivants:
^[[37mABC
^[[0m
Comment supprimer les codes de couleur ANSI du fichier de sortie? Je suppose que le meilleur moyen serait de diriger la sortie via un éditeur de flux de toutes sortes.
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'
more
ou pourless -R
interpréter les codes d'échappement sous forme de couleur au lieu d'un éditeur de texte.Réponses:
Les caractères
^[[37m
et^[[0m
font partie des séquences d'échappement ANSI (codes CSI) . Voir aussi ces spécifications .Utiliser GNU
sed
\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 regexm
est le dernier caractère de la séquence d'échappementSur 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ôtgsed
que vous pouvez installer en utilisantbrew install gnu-sed
.Exemple avec la ligne de commande de OP: (OP signifie affiche originale)
Tom Hale suggère de supprimer toutes les autres séquences d'échappement en utilisant
[a-zA-Z]
au lieu de la lettrem
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'ilK
faut également utiliser en plus dem
supprimer les couleurs d'gcc
erreur / avertissement (n'oubliez pas de redirigergcc 2>&1 | sed...
).En utilisant
perl
La version de
sed
installée sur certains systèmes d'exploitation peut être limitée (par exemple, macOS). La commandeperl
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:
Exemple avec la ligne de commande de OP:
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 ;-)la source
sed
commande et l'explication. :)1;31m
il est préférable d’ajouter;
à votre expression rationnelle: sinoncat colored.log | sed -r 's/\x1b\[[0-9;]*m//g'
ils ne seront pas supprimés.sed
ne fonctionnait pas avec l'exemple présenté, mais cettegsed
version fonctionne.brew install gnu-sed
.J'ai découvert un meilleur dissolvant de séquence d'échappement. Vérifie ça:
perl -pe 's/\x1b\[[0-9;]*[mG]//g'
la source
sed -r
n'est pas le cas.Ce qui est affiché comme
^[
est pas^
et[
; c'est leESC
caractère ASCII , produit par Escou Ctrl[(la^
notation signifie la touche Ctrl).ESC
est 0x1B hexadécimal ou 033 octal, vous devez donc utiliser\x1B
ou\033
dans vos regex:la source
Si vous préférez quelque chose de simple, vous pouvez utiliser le module strip-ansi ( Node.js requis):
Ensuite, utilisez-le comme ceci:
Ou simplement passer une chaîne:
la source
cat
( UUOC ) - il devrait être possible de le fairestrip-ansi colors.o
ou du moinsstrip-ansi < colors.o
.strip-ansi < colors.o
, mais par expérience, les gens sont plus familiarisés avec la tuyauterie. J'ai mis à jour la réponse.commandlinefu donne cette réponse qui supprime les couleurs ANSI ainsi que les commandes de mouvement:
Pour seulement des couleurs, vous voulez:
la source
Je crois que ceci est une suppression faisant autorité de toutes les séquences d'échappement ANSI :
(S'il vous plaît noter qu'il perl, comme beaucoup d' autres langues (mais pas sed), accepte
\e
comme caractère d'échappement Esc,\x1b
ou\033
par code, montré dans les terminaux comme^[
. Je l' utilise ici car il semble plus intuitive.)Cette commande perl, que vous pouvez exécuter sur une seule ligne si vous préférez, comporte quatre remplacements:
Le premier va après les séquences CSI (les séquences de code d’échappement commençant par le "Contrôleur de séquence" de Esc[, qui couvre bien plus que les séquences de sélection de rendu graphique qui composent les codes de couleur et autres décorations de texte).
Le deuxième remplacement supprime les séquences restantes qui impliquent des caractères de fin et se terminent par ST (le terminateur de chaîne, Esc\). Le troisième remplacement est la même chose , mais permet également le système d' exploitation commande des séquences pour mettre fin avec un BEL (
\x07
,\007
souvent\a
).Le quatrième remplacement supprime les échappées restantes.
Pensez également à supprimer d'autres caractères ASCII de largeur nulle, tels que BEL et d'autres caractères de contrôle C0 et C1 plus obscurs . J'ai utilisé
s/[\x00-\x1f\x7f-\x9f\xad]+//g
, qui comprend également Supprimer et Soft Hyphen . Ceci exclut les caractères de largeur nulle codés plus élevés par Unicode, mais je crois que c'est exhaustif pour ASCII (Unicode\x00
-\xff
). Si vous faites cela, supprimez ces dernières car elles peuvent être impliquées dans des séquences plus longues.la source
La question "Répondu" ne fonctionnant pas pour moi, j'ai donc créé cette expression rationnelle à la place pour supprimer les séquences d'échappement générées par le module perl Term :: ANSIColor.
Les expressions rationnelles de Grawity devraient fonctionner correctement, mais l'utilisation de + semble également fonctionner correctement.
la source
The "answered" question
? Voulez-vous dire la réponse acceptée? (2) Cette commande ne fonctionne pas - elle ne s’exécute même pas - car elle a une citation non équilibrée (non équilibrée). (3) C’est une utilisation inutile decat
( UUOC ) - il devrait être possible de le faire . (4) Qui a jamais dit quoi que ce soit à propos des codes dans un fichier?perl -pe
command
colors.o
.o
"tput sgr0" a quitté ce caractère de contrôle ^ (B ^ [
Voici une version modifiée pour s'en occuper.
la source
tput sgr0
que les autres solutions ne semblent jamais pouvoir se débarrasser.J'ai eu un problème similaire avec la suppression des caractères ajoutés lors de la collecte de la sortie interactive supérieure via mastic, ce qui a aidé:
la source
cat
( UUOC ) - il devrait être possible de le faire .perl -pe
command
putty1.log
C'est ce qui a fonctionné pour moi (testé sur Mac OS X)
la source