2011-03-23 12 views
55

Cuando escribe así, imprime el texto en azul:Uso de colores con printf

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

Pero yo quiero tener el formato definido en printf:

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

Ahora he intentado varias opciones de cómo añadir color, sin éxito:

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

incluso he intentado añadir código de atributo para formatear sin éxito. Esto no funciona y no puedo encontrar en ningún lugar un ejemplo, donde los colores se agregan a printf, que tiene un formato definido como en mi caso.

Respuesta

49

Está mezclando las piezas juntas en lugar de separarlas limpiamente.

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

Básicamente, coloque las cosas fijadas en el formato y las variables en los parámetros.

+0

Gracias por su answear. No sabía, ese formato de longitud de cadena debe colocarse entre el atributo de color. –

+0

Esta forma de formatear (que es nueva para mí, por cierto); es todo este estándar? – Chani

17

Esto funciona para mí:

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 
126

En lugar de utilizar los códigos de terminal arcaicos, puedo sugerir la siguiente alternativa. No solo proporciona un código más legible, sino que también le permite mantener la información de color separada de los especificadores de formato tal como originalmente se pretendía.

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

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

Véase mi respuesta HERE para los colores adicionales

+1

//, Esto también lo hace para que no tenga que documentar lo que significan los códigos. Creo que será un paso adelante ayudar a nuestro grupo a ver los guiones como documentos. –

12

Este es un pequeño programa para obtener diferentes colores en la 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; 
} 
+1

esto es c y no bash. – eav

-1
#include <stdio.h> 

//fonts color 
#define FBLACK  "\033[30;" 
#define FRED  "\033[31;" 
#define FGREEN  "\033[32;" 
#define FYELLOW  "\033[33;" 
#define FBLUE  "\033[34;" 
#define FPURPLE  "\033[35;" 
#define D_FGREEN "\033[6;" 
#define FWHITE  "\033[7;" 
#define FCYAN  "\x1b[36m" 

//background color 
#define BBLACK  "40m" 
#define BRED  "41m" 
#define BGREEN  "42m" 
#define BYELLOW  "43m" 
#define BBLUE  "44m" 
#define BPURPLE  "45m" 
#define D_BGREEN "46m" 
#define BWHITE  "47m" 

//end color 
#define NONE  "\033[0m" 

int main(int argc, char *argv[]) 
{ 
    printf(D_FGREEN BBLUE"Change color!\n"NONE); 

    return 0; 
} 
+0

La pregunta es sobre * printf * en Bash, no en C. – cpburnz

3

Ésta es una pequeña función que imprime texto en color mediante secuencias de comandos bash. Puede agregar tantos estilos como desee e incluso imprimir pestañas y líneas nuevas:

#!/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";