238 votes

Suppression des couleurs de la sortie

J'ai un script qui produit une sortie avec des couleurs et j'ai besoin de supprimer les codes ANSI.

#!/bin/bash

exec > >(tee log)   # redirect the output to a file but keep it on stdout
exec 2>&1

./somescript

Le résultat 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 il me donne (dans le fichier journal) :

java (pid  12321) is running...@[60G[  OK  ]

Comment puis-je également supprimer ce @[60G ?

Peut-être y a-t-il un moyen de désactiver complètement la coloration pour l'ensemble du script ?

31voto

edi9999 Points 2679

L'expression régulière ci-dessous manquera certains Codes d'échappement ANSI ainsi que les couleurs à 3 chiffres. Exemple y Fixer sur regex101.com.

Utilisez ceci à la place :

./somescript | sed -r 's/\x1B\[(;?[0-9]{1,3})+[mGK]//g'

J'ai également eu le problème que parfois, le personnage SI apparaissait.

C'est arrivé par exemple avec cette entrée : echo "$(tput setaf 1)foo$(tput sgr0) bar"

Voici une façon de supprimer également le caractère SI (shift in) (0x0f)

./somescript | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" | sed "s/\x0f//g"

11voto

Léa Gris Points 303

Fonction beaucoup plus simple en Bash pur pour filtrer les codes ANSI courants d'un flux de texte :

# Strips common ANSI codes from a text stream

shopt -s extglob # Enable Bash Extended Globbing expressions
ansi_filter() {
  local line
  local IFS=
  while read -r line || [[ "$line" ]]; do
    echo "${line//$'\e'[\[(]*([0-9;])[@-n]/}"
  done
}

Voir :

  1. linuxjournal.com : Globbing étendu
  2. gnu.org : Expansion des paramètres de Bash

10voto

Juan Points 94

Il existe également un outil dédié à la gestion des séquences d'échappement ANSI : ansifiltre . Utilisez la valeur par défaut --text format de sortie pour supprimer toutes les séquences d'échappement ANSI (note : pas seulement la coloration).

réf : https://stackoverflow.com/a/6534712

9voto

Jarodiv Points 116

J'ai eu un problème similaire. Toutes les solutions que j'ai trouvées ont bien fonctionné 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 de 9, et non de 6 :

#!/usr/bin/env bash

string="$(tput setaf 9)foobar$(tput sgr0)"
string_sed="$( sed -r "s/\x1B\[[0-9;]*[JKmsu]//g" <<< "${string}" )"
echo ${#string_sed}

Pour fonctionner correctement, l'expression rationnelle a dû être étendue pour correspondre également à la séquence ajoutée par l'utilisateur. sgr0 (" \E(B ") :

string_sed="$( sed -r "s/\x1B(\[[0-9;]*[JKmsu]|\(B)//g" <<< "${string}" )"

8voto

dtmilano Points 26472

Pas sûr de ce qu'il y a dans ./somescript mais si les séquences d'échappement ne sont pas codées en dur, vous pouvez définir le type de terminal pour les éviter.

TERM=dumb ./somescript 

Par exemple, si vous essayez

TERM=dumb tput sgr0 | xxd

vous verrez qu'il ne produit aucune sortie alors que

tput sgr0 | xxd
00000000: 1b28 421b 5b6d                           .(B.[m

fait (pour xterm-256color).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X