Использование цветов с 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
, но если это возможно, я стараюсь писать скрипты портативный любой shell.dash
обычно является хорошей минимальной базой для переносимости - поэтому ответ здесь работает вbash
,dash
,&zsh
. Если скрипт работает в этих 3, он, скорее всего, переносится практически в любом месте.последняя реализация
printf
indash
[1] не раскрашивает вывод с учетом%s
спецификатор формата с escape-символом ANSI\e
--а, описатель формата%b
в сочетании с восьмеричной3
(эквивалент ASCIIESC
) будет получить работу. Прокомментируйте, пожалуйста, за все отклонения, но насколько мне известно, все снаряды были реализованы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
...и "синий" - это синий во второй строке.
The
%-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; }