การใช้สีกับ printf


94

เมื่อเขียนเช่นนี้จะแสดงข้อความเป็นสีน้ำเงิน:

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

แต่ฉันต้องการกำหนดรูปแบบใน printf:

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

ตอนนี้ฉันได้ลองหลายตัวเลือกในการเพิ่มสี แต่ไม่สำเร็จ:

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

ฉันพยายามเพิ่มรหัสแอตทริบิวต์เพื่อจัดรูปแบบโดยไม่ประสบความสำเร็จ สิ่งนี้ใช้ไม่ได้และฉันไม่พบตัวอย่างที่เพิ่มสีลงใน printf ซึ่งได้กำหนดรูปแบบไว้ในกรณีของฉัน

คำตอบ:


81

คุณกำลังผสมชิ้นส่วนเข้าด้วยกันแทนที่จะแยกชิ้นส่วนออกอย่างหมดจด

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

โดยทั่วไปใส่สิ่งที่คงที่ในรูปแบบและสิ่งที่ตัวแปรในพารามิเตอร์


รายละเอียดเพิ่มเติมบางส่วนที่นี่: คำสั่งprintfประกอบด้วยสตริงรูปแบบและรายการอาร์กิวเมนต์ซึ่งพิมพ์ตามรูปแบบ คุณควรเห็นสีเป็นส่วนหนึ่งของสตริงรูปแบบและด้วยเหตุนี้จึงควรอยู่ในสตริงรูปแบบ
kvantour

คำตอบที่ดีเปลี่ยนวิธีที่ฉันมองปัญหาโดยสิ้นเชิง
Steven Penny

179

แทนที่จะใช้รหัสเทอร์มินัลโบราณฉันขอแนะนำทางเลือกต่อไปนี้ ไม่เพียง แต่ให้โค้ดที่อ่านง่ายขึ้นเท่านั้น แต่ยังช่วยให้คุณสามารถแยกข้อมูลสีออกจากตัวระบุรูปแบบตามที่คุณต้องการในตอนแรก

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

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

ดูคำตอบของฉันที่นี่สำหรับสีเพิ่มเติม


1
// สิ่งนี้ทำให้ฉันไม่ต้องบันทึกความหมายของรหัส ฉันคิดว่ามันจะเป็นอีกก้าวหนึ่งที่จะช่วยให้กลุ่มของเราเห็นสคริปต์เป็นเอกสาร
Nathan Basanese

37

สิ่งนี้ใช้ได้กับฉัน:

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 \0 or \0NNN

printf "\ e [1; 34m นี่คือข้อความสีน้ำเงิน \ e [0m" ก็เหมือนกับฉันทุกประการ
PintoDoido

20

นี่เป็นโปรแกรมขนาดเล็กเพื่อให้ได้สีที่ต่างกันบนเทอร์มินัล

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

11
นี่คือ c และไม่ใช่ทุบตี
eav

14

นี่เป็นฟังก์ชั่นเล็ก ๆ น้อย ๆ ที่พิมพ์ข้อความสีโดยใช้ bash scripting คุณสามารถเพิ่มสไตล์ได้มากเท่าที่คุณต้องการหรือแม้แต่พิมพ์แท็บและบรรทัดใหม่:

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

2
นโยบายของคุณเกี่ยวกับการใช้โค้ดซ้ำที่โพสต์ไปยัง StackOverflow คืออะไร
Daisuke Aramaki

2
@DaisukeAramaki ขอบคุณสำหรับการถาม คุณสามารถใช้ในทางใดก็ได้และทุกที่ที่คุณต้องการ อยู่ภายใต้ใบอนุญาต MIT หากคุณต้องการทำงานร่วมกันอย่า
Arian Acosta

3

ฉันใช้รหัส 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;
}

1

man printf.1มีหมายเหตุที่ด้านล่าง: "... เชลล์ของคุณอาจมีเวอร์ชันprintf... " เป็นของตัวเอง คำถามนี้ถูกแท็กbashแต่ถ้าเป็นไปได้ฉันพยายามเขียนสคริปต์แบบพกพาไปยังเชลล์ ใด ๆ dashมักจะเป็นพื้นฐานขั้นต่ำที่ดีสำหรับการพกพา - ดังนั้นคำตอบที่นี่ทำงานในbash, และdash zshหากสคริปต์ทำงานใน 3 ข้อนั้นก็มักจะพกพาไปได้ทุกที่

การใช้งานล่าสุดprintfในdash[1]ไม่ทำให้เอาต์พุตเป็นสีเนื่องจากตัว%sระบุรูปแบบที่มีอักขระหลีก ANSI \e- แต่ตัวระบุรูปแบบที่%bรวมกับฐานแปด\033(เทียบเท่ากับ ASCII ESC) จะทำให้งานเสร็จสิ้น โปรดแสดงความคิดเห็นสำหรับค่าผิดปกติใด ๆ แต่ AFAIK เชลล์ทั้งหมดได้ใช้งานprintfเพื่อใช้ชุดย่อยฐานแปด ASCII อย่างน้อยที่สุด

กับชื่อของคำถามที่ว่า "การใช้สีที่มี printf" ที่มากที่สุดแบบพกพาวิธีการจัดรูปแบบชุดที่จะรวม%bตัวระบุรูปแบบprintf(ตามที่อ้างถึงในก่อนหน้านี้คำตอบจาก @Vlad) \033กับการหลบหนีฐานแปด


portable-color.sh

#/bin/sh
P="\033["
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 \033[1;34m blue   \033[0m text
-> This is  blue    text

... และ 'blue' เป็นสีน้ำเงินในบรรทัดที่สอง

ตัว%-6sระบุรูปแบบจาก OP อยู่ตรงกลางของสตริงรูปแบบระหว่างลำดับอักขระควบคุมการเปิดและปิด


[1] อ้างอิง: man dashส่วน "บิวท์อิน" :: "printf" :: "รูปแบบ"


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

3
คำถามเกี่ยวกับprintfใน Bash ไม่ใช่ C.
All Workers Are Essential
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.