J'ai un script qui produit une sortie avec des couleurs et je dois supprimer les codes ANSI.
#!/bin/bash
exec > >(tee log) # redirect the output to a file but keep it on stdout
exec 2>&1
./somescript
La sortie est (dans le fichier journal):
java (pid 12321) is running...@[60G[@[0;32m OK @[0;39m]
Je ne savais pas comment mettre le caractère ESC ici, alors j'ai mis @
à sa place.
J'ai changé le script en:
#!/bin/bash
exec > >(tee log) # redirect the output to a file but keep it on stdout
exec 2>&1
./somescript | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
Mais maintenant, cela me donne (dans le fichier journal):
java (pid 12321) is running...@[60G[ OK ]
Comment puis-je également supprimer ce ' @[60G
?
Peut-être existe-t-il un moyen de désactiver complètement la coloration pour tout le script?
strip-ansi
: github.com/chalk/strip-ansi .Réponses:
Votre script essaie de définir la position absolue du curseur sur 60 ( ) pour obtenir tous les OK dans une ligne, que votre ligne ne couvre pas.
[m|K]
sed
m
K
^[[60G
sed
(Correctement,
[m|K]
devrait probablement être(m|K)
ou[mK]
, parce que vous n'essayez pas de faire correspondre un caractère de pipe. Mais ce n'est pas important pour le moment.)Si vous basculez cette dernière correspondance dans votre commande sur
[mGK]
ou(m|G|K)
, vous devriez pouvoir attraper cette séquence de contrôle supplémentaire.la source
brew install gnu-sed
installera une version compatible. Courez avecgsed
.echo "$(tput setaf 1)foo$(tput sgr0) bar" | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" | cat -A
, j'obtiens:foo^O bar$
Donc je suppose que certains caractères ne sont pas correctement supprimés, non? Savez-vous comment corriger?setaf
supports) nécessitent plus de paramètres que deux; mon regex en prend en charge deux. Changer le premier?
pour*
devrait aider. La gestionsgr0
est possible, mais en fonction d'une recherche, elle se développe probablement en dehors de la portée de cette réponse hacky regex.sed
au tuyau pour[38;5;45m
). Cette réponse alternative fonctionne unix.stackexchange.com/a/55547/168277Je n'ai pu obtenir de résultats décents avec aucune des autres réponses, mais ce qui suit a fonctionné pour moi:
Si j'ai seulement supprimé le caractère de contrôle "^ [", il a laissé le reste des données de couleur, par exemple, "33m". Inclure le code couleur et "m" a fait l'affaire. Je suis perplexe avec s / \ x1B // g ne fonctionne pas parce que \ x1B [31m fonctionne certainement avec echo.
la source
-E
place de-r
pour une expression régulière étendue. Plus d'informations peuvent être trouvées ici{1,3}
à{,3}
(sinon il sautillait encore des contrôles), merci pour votre solution!sed -r "s/[[:cntrl:]]\[([0-9]{1,3};)*[0-9]{1,3}m//g"
À mon humble avis, la plupart de ces réponses essaient trop fort de restreindre ce qui se trouve à l'intérieur du code d'échappement. En conséquence, ils finissent par manquer des codes communs tels que
[38;5;60m
(couleur ANSI de premier plan 60 à partir du mode 256 couleurs).Ils nécessitent également l'
-r
option qui active les extensions GNU . Ce ne sont pas obligatoires; ils améliorent simplement la lecture de l'expression régulière.Voici une réponse plus simple qui gère les échappements de 256 couleurs et fonctionne sur les systèmes avec non-GNU
sed
:Cela attrapera tout ce qui commence par
[
, a un nombre quelconque de décimales et de points-virgules et se termine par une lettre. Cela devrait intercepter l'une des séquences d'échappement ANSI courantes .Pour le plaisir, voici une solution plus large et plus générale (mais peu testée) pour toutes les séquences d'échappement ANSI imaginables :
(et si vous avez le problème SI de @ edi9999, ajoutez
| sed "s/\x0f//g"
à la fin; cela fonctionne pour tout caractère de contrôle en le remplaçant0f
par l'hexagone du caractère indésirable)la source
|
dans sed,]
dans une classe de caractères dans sed et'
dans une chaîne bash entre guillemets simples. Cela fonctionne maintenant pour moi pour un cas de test très basique.Pour l'utilisation de Mac OSX ou BSD
la source
-E
drapeau pour sed pour activer l'expression rationnelle étendue.J'ai aussi eu le problème que parfois, le caractère SI apparaissait.
C'est arrivé par exemple avec cette entrée:
echo "$(tput setaf 1)foo$(tput sgr0) bar"
Voici un moyen de supprimer également le caractère SI (shift in) (0x0f)
la source
Hmm, je ne sais pas si cela fonctionnera pour vous, mais 'tr' va 'supprimer' (supprimer) les codes de contrôle - essayez:
la source
rwxr-xr-x 1 tokra admin 22 Oct 18 14:21 [0m[01;36m/usr/local/opt/gradle[0m -> [01;34m../Cellar/gradle/4.2.1[0m/
J'avais un problème similaire. Toutes les solutions que j'ai trouvées fonctionnaient bien pour les codes de couleur mais n'ont pas supprimé les caractères ajoutés par
"$(tput sgr0)"
(réinitialisation des attributs).En prenant, par exemple, la solution dans le commentaire de davemyron, la longueur de la chaîne résultante dans l'exemple ci-dessous est 9, pas 6:
Pour fonctionner correctement, l'expression régulière devait être étendue pour correspondre également à la séquence ajoutée par
sgr0
("\E(B
"):la source
Fonction beaucoup plus simple dans pure Bash pour filtrer les codes ANSI communs d'un flux de texte:
Voir:
la source
tldr
. (Bien que j'utilise zsh, cela pourrait aussi être à cause de cela.)extglob
ou ne comprendra probablement pas non plus le remplacement de chaîne.sed
mentionnées ici qui fonctionnera avec Zsh.La solution de @ jeff-bowman m'a aidé à me débarrasser de CERTAINS codes de couleurs. J'ai ajouté une autre petite partie à l'expression régulière afin d'en supprimer un peu plus:
la source
Voici une solution pure Bash.
Enregistrez sous
strip-escape-codes.sh
, rendez exécutable, puis exécutez<command-producing-colorful-output> | ./strip-escape-codes.sh
.Notez que cela supprime tous les codes / séquences d'échappement ANSI. Si vous souhaitez décaper uniquement les couleurs, remplacez-les
[a-zA-Z]
par"m"
.Bash> = 4,0:
Bash <4.0:
la source
L'idée controversée serait de reconfigurer les paramètres du terminal pour cet environnement de processus afin de faire savoir au processus que le terminal ne prend pas en charge les couleurs.
Quelque chose comme
TERM=xterm-mono ./somescript
ça me vient à l'esprit. YMMV avec votre système d'exploitation spécifique et la capacité de votre script à comprendre les paramètres de couleur du terminal.la source
Cela fonctionne pour moi:
la source
somescript
est mis en œuvre. Il peut reconnaître ou non que sa sortie standard est un tty. (Les mots délinquants codent en dur des codes d'échappement spécifiques aux terminaux dans le programme, et se cassent horriblement lorsqu'ils sont utilisés sur d'autres terminaux ou dans des scripts).