web-dev-qa-db-fra.com

Utiliser les couleurs avec printf

Lorsqu'il est écrit comme ceci, il affiche le texte en bleu:

printf "\e[1;34mThis is a blue text.\e[0m"

Mais je veux avoir un format défini dans printf:

printf '%-6s' "This is text"

Maintenant, j'ai essayé plusieurs options pour ajouter de la couleur, sans succès:

printf '%-6s' "\e[1;34mThis is text\e[0m"

J'ai même essayé d'ajouter du code d'attribut au format sans succès ... Cela ne fonctionne pas et je ne trouve nulle part un exemple où des couleurs sont ajoutées à printf, qui a défini le format comme dans mon cas.

70
Jernej Jerin

Vous mélangez les pièces au lieu de les séparer proprement.

printf '\e[1;34m%-6s\e[m' "This is text"

Fondamentalement, mettez les éléments fixes dans le format et les éléments variables dans les paramètres.

61
geekosaur

Plutôt que d’utiliser des codes de terminal archaïques, puis-je suggérer la solution suivante? Non seulement il fournit un code plus lisible, mais il vous permet également de conserver les informations de couleur séparément des spécificateurs de format, comme vous le vouliez initialement.

blue=$(tput setaf 4)
normal=$(tput sgr0)

printf "%40s\n" "${blue}This text is blue${normal}"

Voir ma réponse ICI pour des couleurs supplémentaires

144
SiegeX

Cela fonctionne pour moi:

printf "%b" "\e[1;34mThis is a blue text.\e[0m"

De printf(1):

%b     ARGUMENT as a string with '\' escapes interpreted, except that octal
       escapes are of the form \0 or \0NNN
21
Vlad

Ceci est un petit programme pour obtenir des couleurs différentes sur le terminal.

#include <stdio.h>

#define KNRM  "\x1B[0m"
#define KRED  "\x1B[31m"
#define KGRN  "\x1B[32m"
#define KYEL  "\x1B[33m"
#define KBLU  "\x1B[34m"
#define KMAG  "\x1B[35m"
#define KCYN  "\x1B[36m"
#define KWHT  "\x1B[37m"

int main()
{
    printf("%sred\n", KRED);
    printf("%sgreen\n", KGRN);
    printf("%syellow\n", KYEL);
    printf("%sblue\n", KBLU);
    printf("%smagenta\n", KMAG);
    printf("%scyan\n", KCYN);
    printf("%swhite\n", KWHT);
    printf("%snormal\n", KNRM);

    return 0;
}
18
Kritpal Singh

Ceci est une petite fonction qui imprime du texte coloré en utilisant le script bash. Vous pouvez ajouter autant de styles que vous le souhaitez et même imprimer des onglets et de nouvelles lignes:

#!/bin/bash

# prints colored text
print_style () {

    if [ "$2" == "info" ] ; then
        COLOR="96m";
    Elif [ "$2" == "success" ] ; then
        COLOR="92m";
    Elif [ "$2" == "warning" ] ; then
        COLOR="93m";
    Elif [ "$2" == "danger" ] ; then
        COLOR="91m";
    else #default color
        COLOR="0m";
    fi

    STARTCOLOR="\e[$COLOR";
    ENDCOLOR="\e[0m";

    printf "$STARTCOLOR%b$ENDCOLOR" "$1";
}

print_style "This is a green text " "success";
print_style "This is a yellow text " "warning";
print_style "This is a light blue with a \t tab " "info";
print_style "This is a red text with a \n new line " "danger";
print_style "This has no color";
9
Arian Acosta

J'utilise ce code c pour imprimer une sortie Shell colorée. Le code est basé sur this post.

//General Formatting
#define GEN_FORMAT_RESET                "0"
#define GEN_FORMAT_BRIGHT               "1"
#define GEN_FORMAT_DIM                  "2"
#define GEN_FORMAT_UNDERSCORE           "3"
#define GEN_FORMAT_BLINK                "4"
#define GEN_FORMAT_REVERSE              "5"
#define GEN_FORMAT_HIDDEN               "6"

//Foreground Colors
#define FOREGROUND_COL_BLACK            "30"
#define FOREGROUND_COL_RED              "31"
#define FOREGROUND_COL_GREEN            "32"
#define FOREGROUND_COL_YELLOW           "33"
#define FOREGROUND_COL_BLUE             "34"
#define FOREGROUND_COL_Magenta          "35"
#define FOREGROUND_COL_CYAN             "36"
#define FOREGROUND_COL_WHITE            "37"

//Background Colors
#define BACKGROUND_COL_BLACK            "40"
#define BACKGROUND_COL_RED              "41"
#define BACKGROUND_COL_GREEN            "42"
#define BACKGROUND_COL_YELLOW           "43"
#define BACKGROUND_COL_BLUE             "44"
#define BACKGROUND_COL_Magenta          "45"
#define BACKGROUND_COL_CYAN             "46"
#define BACKGROUND_COL_WHITE            "47"

#define Shell_COLOR_ESCAPE_SEQ(X) "\x1b["X"m"
#define Shell_FORMAT_RESET  ANSI_COLOR_ESCAPE_SEQ(GEN_FORMAT_RESET)

int main(int argc, char* argv[])
{
    //The long way
    fputs(Shell_COLOR_ESCAPE_SEQ(GEN_FORMAT_DIM";"FOREGROUND_COL_YELLOW), stdout);
    fputs("Text in gold\n", stdout);
    fputs(Shell_FORMAT_RESET, stdout);
    fputs("Text in default color\n", stdout);

    //The short way
    fputs(Shell_COLOR_ESCAPE_SEQ(GEN_FORMAT_DIM";"FOREGROUND_COL_YELLOW)"Text in gold\n"Shell_FORMAT_RESET"Text in default color\n", stdout);

    return 0;
}
2
Jonny Schubert