Transférer une commande à travers un filtre de couleur

13

Existe-t-il quelque chose comme ça sous Unix?

$ echo "this should show in red" | red
$ echo "this should show in green" | green
$ echo "this should show in blue" | blue

Ici, je ne veux pas que du texte de code couleur littéral apparaisse (pour être collé dans un fichier, par exemple). Je veux juste dire que le texte apparaît réellement dans le terminal comme cette couleur. Est-ce possible?

George
la source

Réponses:

14

Voici un petit script qui fait exactement cela. Enregistrez-le comme colordans un répertoire de votre $PATH(par exemple, ~/binsi c'est dans votre $PATH):

#!/usr/bin/env perl

use strict;
use warnings;
use Term::ANSIColor; 

my $color=shift;
while (<>) {
    print color("$color").$_.color("reset");
} 

Ensuite, passez votre texte à travers le script, en donnant .comme motif à faire correspondre et en spécifiant une couleur:

capture d'écran d'un terminal exécutant le script

Les couleurs prises en charge dépendent des capacités de votre terminal. Pour plus de détails, consultez la documentation du Term::ANSIColorpackage.

terdon
la source
Existe-t-il une liste de couleurs valables pour passer quelque part?
George
@George qui dépend de votre configuration. Si vous avez un terminal compatible RVB, vous pouvez même utiliser des choses comme rgb001, rgb123etc. Voir perldoc.perl.org/Term/ANSIColor.html#Supported-Colors pour plus de détails.
terdon
23

Vous utiliseriez tputpour cela:

tput setaf 1
echo This is red
tput sgr0
echo This is back to normal

Cela peut être utilisé pour construire un tuyau:

red() { tput setaf 1; cat; tput sgr0; }
echo This is red | red

Les couleurs de base sont respectivement noir (0), rouge (1), vert, jaune, bleu, magenta, cyan et blanc (7). Vous trouverez tous les détails dans la terminfo(5)page de manuel .

Stephen Kitt
la source
6

Avec zsh:

autoload colors; colors
for color (${(k)fg})
  eval "$color() {print -n \$fg[$color]; cat; print -n \$reset_color}"

Puis:

$ echo "while" | blue
while
Stéphane Chazelas
la source
1

(comme indiqué dans les commentaires, utiliseztput plutôt si vous l'avez)

Utilisation du shell bourne et de la commande echo(intégrée) qui comprend l'échappement ANSI \eavec l' -eoption:

black()  { IFS= ; while read -r line; do echo -e '\e[30m'$line'\e[0m'; done; }
red()    { IFS= ; while read -r line; do echo -e '\e[31m'$line'\e[0m'; done; }
green()  { IFS= ; while read -r line; do echo -e '\e[32m'$line'\e[0m'; done; }
yellow() { IFS= ; while read -r line; do echo -e '\e[33m'$line'\e[0m'; done; }
blue()   { IFS= ; while read -r line; do echo -e '\e[34m'$line'\e[0m'; done; }
purple() { IFS= ; while read -r line; do echo -e '\e[35m'$line'\e[0m'; done; }
cyan()   { IFS= ; while read -r line; do echo -e '\e[36m'$line'\e[0m'; done; }
white()  { IFS= ; while read -r line; do echo -e '\e[37m'$line'\e[0m'; done; }

echo '    foo\n    bar' | red

ou un script shell plus générique (disons /usr/local/bin/colorize):

#!/bin/sh

usage() {
    echo 'usage:' >&2
    echo '  some-command | colorize {black, red, green, yellow, blue, purple, cyan, white}' >&2
    exit 1
}

[ -z "$1" ] && usage

case $1 in
    black)  color='\e[30m' ;;
    red)    color='\e[31m' ;;
    green)  color='\e[32m' ;;
    yellow) color='\e[33m' ;;
    blue)   color='\e[34m' ;;
    purple) color='\e[35m' ;;
    cyan)   color='\e[36m' ;;
    white)  color='\e[36m' ;;
    *) usage ;;
esac

IFS=
while read -r line; do
    echo -e $color$line'\e[0m'
done

IFS=est nécessaire pour empêcher la suppression des espaces blancs (voir POSIX pour plus de détails).

comment fonctionne IFS

wataash
la source
Je conseille de préférer utiliser tput.
LinuxSecurityFreak
Il s'agit d'une solution totalement non portable. Je veux dire que vous devez adhérer à POSIX.
LinuxSecurityFreak
1
Bien sûr, si nous le pouvions. Il est destiné à être utilisé sur des systèmes embarqués ou des environnements de secours tels que busybox. J'ai décidé d'écrire cette réponse parce que je pense que ces extraits de code sont utiles dans certaines situations - au moins pour les utilisateurs de busybox et pour moi, qui ne devaient produire des couleurs qu'avec les commandes intégrées du shell dans un environnement intégré aujourd'hui.
wataash
oublié de dire que la busybox ordinaire n'a pas de tput.
wataash