Использование цветов с printf

когда написано так, он выводит текст синим цветом:

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

но я хочу иметь формат, определенный в printf:

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

Теперь я попробовал несколько вариантов, как добавить цвет, без успеха:

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

Я даже пытался добавить код атрибута в формат без успеха. Это не работает, и я не могу найти нигде пример, где цвета добавляются в printf, который определил формат, как в моем случае.

8 ответов


вы смешиваете части совместно вместо отделять их чисто.

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

в основном, поместите фиксированный материал в формат и переменный материал в параметры.


вместо использования архаичных терминальных кодов, могу я предложить следующую альтернативу. Он не только обеспечивает более читаемый код, но также позволяет хранить информацию о цвете отдельно от спецификаторов формата так, как вы изначально намеревались.

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

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

смотрите мой ответ здесь дополнительные цвета


это работает для меня:

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

С printf(1):

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

Это небольшая программа, чтобы получить другой цвет на терминале.

#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;
}

Это небольшая функция, которая печатает цветной текст с помощью сценариев bash. Вы можете добавить столько стилей, сколько хотите, и даже печатать вкладки и новые строки:

#!/bin/bash

# prints colored text
print_style () {

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

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

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

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";

Я использую этот код c для печати вывода цветной оболочки. Код основан на этой пост.

//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;
}

man printf.1 есть примечание внизу: "...ваша оболочка может иметь свою собственную версию printf...". Этот вопрос помечен как bash, но если это вообще возможно, я пытаюсь писать скрипты portable to любой shell. dash обычно является хорошей минимальной базой для переносимости - поэтому ответ здесь работает в bash, dash, & zsh. Если скрипт работает в этих 3, он, скорее всего, переносится практически в любом месте.

последняя реализация printf in dash[1] не раскрашивает вывод с учетом %s спецификатор формата с escape-символом ANSI \e -- а, описатель формата %b в сочетании с восьмеричной 3 (эквивалент ASCII ESC) будет получить работу. Пожалуйста, прокомментируйте любые выбросы, но AFAIK, все оболочки реализованы printf использовать восьмеричное подмножество ASCII как минимум.

к заголовку вопроса "использование цветов с printf", наиболее портативный способ установить форматирование-объединить %b спецификатор формата для printf (как указано в предыдущем ответ от @ Vlad) с восьмеричным побегом 3.


portable-color.sh

#/bin/sh
P="3["
BLUE=34
printf "-> This is %s %-6s %s text \n" $P"1;"$BLUE"m" "blue" $P"0m"
printf "-> This is %b %-6s %b text \n" $P"1;"$BLUE"m" "blue" $P"0m"

выходы:

$ ./portable-color.sh
-> This is 3[1;34m blue   3[0m text
-> This is  blue    text

...и "синий" - это синий во второй строке.

на %-6s спецификатор формата из OP находится в середине строки формата между открытием & закрытие последовательности управляющих символов.


[1] Ref:man dash раздел "Builtins"::" printf":: "формат"


#include <stdio.h>

//fonts color
#define FBLACK      "3[30;"
#define FRED        "3[31;"
#define FGREEN      "3[32;"
#define FYELLOW     "3[33;"
#define FBLUE       "3[34;"
#define FPURPLE     "3[35;"
#define D_FGREEN    "3[6;"
#define FWHITE      "3[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        "3[0m"

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

    return 0;
}