在 printf 中使用颜色
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5412761/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Using colors with printf
提问by Jernej Jerin
When written like this, it outputs text in blue:
当这样写时,它输出蓝色文本:
printf "\e[1;34mThis is a blue text.\e[0m"
But I want to have format defined in printf:
但我想在 printf 中定义格式:
printf '%-6s' "This is text"
Now I have tried several options how to add color, with no success:
现在我尝试了几种如何添加颜色的选项,但没有成功:
printf '%-6s' "\e[1;34mThis is text\e[0m"
I even tried to add attribute code to format with no success. This does not work and I can't find anywhere an example, where colors are added to printf, which has defined format as in my case.
我什至尝试将属性代码添加到格式中,但没有成功。这不起作用,我在任何地方都找不到示例,其中将颜色添加到 printf 中,它定义了格式,就像我的情况一样。
采纳答案by geekosaur
You're mixing the parts together instead of separating them cleanly.
您将这些部分混合在一起,而不是将它们干净地分开。
printf '\e[1;34m%-6s\e[m' "This is text"
Basically, put the fixed stuff in the format and the variable stuff in the parameters.
基本上,将固定的东西放在格式中,将可变的东西放在参数中。
回答by Vlad
This works for me:
这对我有用:
printf "%b" "\e[1;34mThis is a blue text.\e[0m"
From printf(1)
:
来自printf(1)
:
%b ARGUMENT as a string with '\' escapes interpreted, except that octal escapes are of the form
or%b ARGUMENT as a string with '\' escapes interpreted, except that octal escapes are of the form
orblue=$(tput setaf 4) normal=$(tput sgr0) printf "%40s\n" "${blue}This text is blue${normal}"
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; }
NNN#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; }
#!/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";
回答by SiegeX
Rather than using archaic terminal codes, may I suggest the following alternative. Not only does it provide more readable code, but it also allows you to keep the color information separate from the format specifiers just as you originally intended.
我可以建议以下替代方案,而不是使用古老的终端代码。它不仅提供了更具可读性的代码,而且还允许您按照最初的意图将颜色信息与格式说明符分开。
//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;
}
See my answer HEREfor additional colors
请在此处查看我的答案以获取其他颜色
回答by Kritpal Singh
This is a small program to get different color on terminal.
这是一个在终端上获得不同颜色的小程序。
#/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"
回答by Thlv
$ ./portable-color.sh
-> This is 3[1;34m blue 3[0m text
-> This is blue text
回答by Arian Acosta
This is a little function that prints colored text using bash scripting. You may add as many styles as you want, and even print tabs and new lines:
这是一个使用 bash 脚本打印彩色文本的小函数。您可以根据需要添加任意数量的样式,甚至可以打印制表符和新行:
##代码##回答by Jonny Schubert
回答by AaronDanielson
man printf.1
has a note at the bottom: "...your shell may have its own version of printf
...". This question is tagged for bash
, but if at all possible, I try to write scripts portable to anyshell. dash
is usually a good minimum baseline for portability - so the answer here works in bash
, dash
, & zsh
. If a script works in those 3, it's most likely portable to just about anywhere.
man printf.1
在底部有一个注释:“......你的外壳可能有它自己的printf
......版本”。这个问题被标记为bash
,但如果可能的话,我会尝试编写可移植到任何shell 的脚本。 dash
通常是可移植性的一个很好的最低基线 - 所以这里的答案适用于bash
, dash
, & zsh
。如果一个脚本在这 3 个中工作,它很可能可以移植到几乎任何地方。
The latest implementation of printf
in dash
[1]doesn't colorize output given a %s
format specifier with an ANSI escape character \e
-- but,a format specifier %b
combined with octal \033
(equivalent to an ASCII ESC
) will get the job done. Please comment for any outliers, but AFAIK, all shells have implemented printf
to use the ASCII octal subset at a bare minimum.
printf
在dash
[1]中的最新实现不会在给定%s
带有 ANSI 转义字符的格式说明符的情况下对输出进行着色\e
——但是,%b
结合八进制\033
(相当于 ASCII ESC
)的格式说明符将完成工作。请评论任何异常值,但 AFAIK,所有 shell 都已实现printf
以最低限度使用 ASCII 八进制子集。
To the title of the question "Using colors with printf", the most portableway to set formatting is to combine the %b
format specifier for printf
(as referenced in an earlier answerfrom @Vlad) with an octal escape \033
.
对于问题“在 printf 中使用颜色”的标题,设置格式的最便携方法是将%b
格式说明符printf
(如@Vlad的早期答案中所引用)与八进制转义符结合使用\033
。
portable-color.sh
便携式color.sh
##代码##Outputs:
输出:
##代码##...and 'blue' is blue in the second line.
...并且'blue'在第二行中是蓝色的。
The %-6s
format specifier from the OP is in the middle of the format string between the opening & closing control character sequences.
在%-6s
从OP格式说明是在开合控制字符序列之间的格式串的中间。
[1] Ref: man dash
Section "Builtins" :: "printf" :: "Format"
[1] Ref: man dash
Section "Builtins" :: "printf" :: "Format"