प्रिंटफ के साथ रंगों का उपयोग करना


90

जब इस तरह लिखा जाता है, तो यह नीले रंग में पाठ को आउटपुट करता है:

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

लेकिन मैं प्रिंटफ में परिभाषित प्रारूप चाहता हूं:

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

अब मैंने कई विकल्पों की कोशिश की है कि कैसे रंग जोड़ा जाए, जिसमें कोई सफलता नहीं है:

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

मैंने बिना किसी सफलता के प्रारूप में विशेषता कोड जोड़ने की भी कोशिश की। यह काम नहीं करता है और मुझे कहीं भी एक उदाहरण नहीं मिल सकता है, जहां प्रिंट में रंग जोड़े जाते हैं, जिसने मेरे मामले में प्रारूप को परिभाषित किया है।

जवाबों:


79

आप भागों को साफ सफाई से अलग करने के बजाय एक साथ मिला रहे हैं।

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

मूल रूप से, निर्धारित सामान को प्रारूप में और चर सामान को मापदंडों में रखें।


आपके उत्तर के लिए धन्यवाद। नहीं पता था, कि रंग के बीच में स्ट्रिंग स्ट्रिंग प्रारूप में रखा जाना चाहिए।
जेर्नेज जेरिन

प्रारूपण का यह तरीका (जो मेरे लिए नया है); क्या यह सब मानक है?
चनी

@Chani printfकमांड को printf()C भाषा में फ़ंक्शन के बाद बनाया गया है। पहला पैरामीटर / तर्क हमेशा formatस्ट्रिंग होता है जिसमें सभी स्वरूपण शामिल होते हैं (और शायद रंग, भी) और बाकी पैरामीटर डेटा होते हैं। यदि आप कुछ विशिष्ट शैली के साथ कुछ पाठ बाहर रखना चाहते हैं, तो यह प्रारूप स्ट्रिंग में सभी स्वरूपण और रंग से बचने के लिए समझ में आता है। ध्यान दें कि प्रारूप स्ट्रिंग विश्वसनीय माना जाता है और इसमें उपयोगकर्ता इनपुट कभी नहीं होना चाहिए।
मिकीको रेंटालिनेन

यहां कुछ अतिरिक्त विवरण: कमांड printfमें एक प्रारूप स्ट्रिंग और एक तर्क सूची होती है जो प्रारूप के अनुसार मुद्रित होती है। आपको रंग को प्रारूप-स्ट्रिंग के भाग के रूप में देखना चाहिए और इसलिए, उन्हें प्रारूप स्ट्रिंग में होना चाहिए।
कांवट

177

पुरातन टर्मिनल कोड का उपयोग करने के बजाय, मैं निम्नलिखित विकल्प सुझा सकता हूं। यह न केवल अधिक पठनीय कोड प्रदान करता है, बल्कि यह आपको मूल रूप से जैसा आप चाहते हैं, वैसा ही रंग सूचना को प्रारूप के विवरण से अलग रखने की अनुमति देता है।

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

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

अतिरिक्त रंगों के लिए यहां मेरा जवाब देखें


1
//, यह भी बनाता है ताकि मुझे दस्तावेज का मतलब न हो कि कोड का क्या मतलब है। मुझे लगता है कि यह हमारे समूह को डॉक्स के रूप में स्क्रिप्ट देखने में मदद करने के लिए एक कदम आगे होगा।
नाथन बसानी

38

यह मेरे लिए काम करता है:

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; 34mThis एक नीला पाठ है। \ e [0m" मेरे लिए बिल्कुल यही करता है।
पिंटोडॉइडो

22

यह टर्मिनल पर अलग-अलग रंग प्राप्त करने के लिए एक छोटा कार्यक्रम है।

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

9
यह c है और बैश नहीं है।
EAV

14

यह एक छोटा सा फंक्शन है जो बैश स्क्रिप्टिंग का उपयोग करके रंगीन टेक्स्ट प्रिंट करता है। आप जितनी चाहें उतनी शैलियों को जोड़ सकते हैं, और यहां तक ​​कि टैब और नई लाइनें भी प्रिंट कर सकते हैं:

#!/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 पर पोस्ट किए गए कोड के पुन: उपयोग पर आपकी नीति क्या है?
डेइसुके अरामकी

2
@DaisukeAramaki पूछने के लिए धन्यवाद। आप किसी भी तरह से और कहीं भी उपयोग कर सकते हैं। यह एमआईटी लाइसेंस के तहत है। यदि आप सहयोग करना चाहते हैं, तो Gist में
एरियन

5

मैं इस सी कोड का उपयोग रंगीन शेल आउटपुट को प्रिंट करने के लिए करता हूं। कोड इस पोस्ट पर आधारित है ।

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

2

man printf.1नीचे एक नोट है: "... आपके शेल का अपना संस्करण हो सकता है printf..."। इस प्रश्न के लिए टैग किया गया है bash, लेकिन यदि संभव हो तो, मैं किसी भी शेल के लिए स्क्रिप्ट को पोर्टेबल लिखने की कोशिश करता हूं । dashआमतौर पर पोर्टेबिलिटी के लिए एक अच्छा न्यूनतम आधारभूत है - तो जवाब यहाँ में काम करता है bash, dash, औरzsh । यदि कोई स्क्रिप्ट उन 3 में काम करती है, तो यह केवल कहीं भी पोर्टेबल होने की संभावना है।

[1]printf में नवीनतम कार्यान्वयन आउटपुट को रंगीन नहीं करता है जो एक एएनएसआई से बच चरित्र के साथ एक प्रारूप निर्दिष्ट करता है - लेकिन, ऑक्टल (एक एएससीआईआई के बराबर ) के साथ संयुक्त एक प्रारूप विनिर्देशक को काम मिलेगा। कृपया किसी भी आउटलेयर के लिए टिप्पणी करें, लेकिन AFAIK, सभी गोले लागू किए गए हैंdash%s\e%b\033ESCprintf एक नंगे न्यूनतम पर ASCII अष्टक उपसमुच्चय का उपयोग लिए किया है।

प्रश्न का शीर्षक "प्रिंटफ के साथ रंगों का उपयोग करना" के लिए, प्रारूपण को निर्धारित करने का सबसे पोर्टेबल तरीका है , ऑक्टल एस्केप के साथ %bप्रारूप विनिर्देशक को printf( @ व्लाद से पहले के उत्तर में संदर्भित) \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

... और 'ब्लू' दूसरी लाइन में नीला है।

%-6sओपी से फॉर्मेट स्पेसिफायर खोलते और बंद नियंत्रण चरित्र दृश्यों के बीच प्रारूप स्ट्रिंग के बीच में है।


[१] रेफरी: man dashसेक्शन "बिलिंस" :: "प्रिंटफ" :: "फॉर्मेट"


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

2
सवाल बैश में प्रिंटफ के बारे में है, सी। में नहीं
सभी श्रमिक आवश्यक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.