প্রিন্টফের সাথে রঙ ব্যবহার করা


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"

মূলত, ফর্ম্যাটটিতে স্থির জিনিস এবং প্যারামিটারগুলিতে পরিবর্তনশীল স্টাফ রাখুন।


তোমার উত্তর দেওয়ার জন্য ধন্যবাদ জানতেন না, সেই স্ট্রিং দৈর্ঘ্যের ফর্ম্যাটটি রঙের পরিমাণের মধ্যে রাখতে হবে।
জেরনেজ জেরিন

বিন্যাসের এই পদ্ধতিটি (যা আমার কাছে বিটিডব্লিউ নতুন); এই সব মান?
চানি

@ শনি printfকমান্ডটি printf()সি ভাষায় ফাংশনের পরে তৈরি করা হয়েছে। সেখানে প্রথম প্যারামিটার / আর্গুমেন্টটি সর্বদা formatস্ট্রিং থাকে যার মধ্যে সমস্ত বিন্যাস (এবং রঙও খুব বেশি) অন্তর্ভুক্ত থাকে এবং বাকী পরামিতিগুলি ডেটা হয়। আপনি যদি কিছু নির্দিষ্ট শৈলীর সাথে কিছু পাঠ্য পাঠাতে চান তবে বিন্যাসের স্ট্রিংয়ে সমস্ত বিন্যাস এবং রঙ পালিয়ে যায় তা বোধগম্য। নোট করুন যে ফর্ম্যাট স্ট্রিংটি বিশ্বাসযোগ্য হিসাবে বিবেচিত হয় এবং এতে কখনও ব্যবহারকারীর ইনপুট থাকে না।
মিক্কো রেন্টালাইনেন

কিছু অতিরিক্ত বিবরণ এখানে: কমান্ডটিতে printfএকটি ফর্ম্যাট স্ট্রিং এবং একটি আর্গুমেন্ট তালিকা রয়েছে যা ফর্ম্যাট অনুযায়ী মুদ্রিত হয়। ফর্ম্যাট-স্ট্রিংয়ের অংশ হিসাবে আপনার রঙগুলি দেখতে পাওয়া উচিত এবং সেজন্য এগুলি ফর্ম্যাট স্ট্রিংয়ের অন্তর্ভুক্ত।
কাঁভন্তুর

177

প্রত্নতাত্ত্বিক টার্মিনাল কোডগুলি ব্যবহার না করে, আমি নিম্নলিখিত বিকল্পটি পরামর্শ দিতে পারি। এটি কেবল আরও পঠনযোগ্য কোড সরবরাহ করে না, তবে এটি রঙিন তথ্যকে আপনি মূলরূপ হিসাবে যেমন বিন্যাসের স্পেসিফায়ারদের থেকে পৃথক রাখতে পারবেন তারও অনুমতি দেয়।

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

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

অতিরিক্ত বর্ণের জন্য আমার উত্তরটি এখানে দেখুন


4
//, এটি এটিও তৈরি করে যাতে কোডগুলি কী বোঝায় তা আমাকে ডকুমেন্ট করতে হবে না। আমি মনে করি এটি আমাদের গোষ্ঠীকে ডক্স হিসাবে স্ক্রিপ্টগুলি দেখতে সহায়তা করার এক ধাপ এগিয়ে যাবে forward
নাথান বাসানিজ 10'17

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; 34m এটি একটি নীল পাঠ্য।
পিন্টোডয়েডো

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
এটি সি এবং বাশ নয়।
ইভা

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

4
স্ট্যাকওভারফ্লোতে পোস্ট করা কোড পুনরায় ব্যবহারের বিষয়ে আপনার নীতি কী?
ডাইসুক আরমাকি

4
জিজ্ঞাসা করার জন্য ধন্যবাদ আপনি যে কোনও উপায়ে এবং যে কোনও জায়গায় ব্যবহার করতে পারেন। এটি এমআইটি লাইসেন্সের আওতায়। আপনি যদি সহযোগিতা করতে চান তবে গিস্টটিতে সংক্ষিপ্ত বিবরণ
আরিয়ান অ্যাকোস্টা

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 টিতে কাজ করে তবে এটি সম্ভবত কোথাও কোথাও বহনযোগ্য।

সর্বশেষ বাস্তবায়ন printfমধ্যে dash[1] না রঙ আউটপুট একটি প্রদত্ত নেই %sএকটি ANSI এস্কেপ অক্ষর সঙ্গে বিন্যাস সুনির্দিষ্টভাবে উল্লেখ করা \e- কিন্তু একটি বিন্যাসে সুনির্দিষ্টভাবে উল্লেখ করা %bঅকট্যাল সঙ্গে মিলিত \033(একটি হওয়া ASCII সমতুল্য ESCকাজ শেষ হবে)। যেকোন আউটলিয়ারের জন্য মন্তব্য করুন, তবে এএফএআইকি, সমস্ত শেলগুলি কার্যকর করেছেprintf ন্যূনতম ন্যূনতম সময়ে ASCII অক্টাল সাবসেটটি ব্যবহার করতে ।

"প্রিন্টফের সাথে রঙগুলি ব্যবহার করে" প্রশ্নের শিরোনামে, বিন্যাস সেট করার সর্বাধিক বহনযোগ্য উপায় হ'ল অষ্টাল পালানোর সাথে %bফর্ম্যাট স্পেসিফায়ারকে printf( @ ভ্ল্যাডের পূর্বের উত্তরে উল্লেখ করা হয়েছে ) একত্রিত করা \033


পোর্টেবল- 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ওপি থেকে বিন্যাস সুনির্দিষ্টভাবে উল্লেখ করা উদ্বোধনী & ক্লোজিং নিয়ন্ত্রণ চরিত্র সিকোয়েন্স মধ্যে বিন্যাস স্ট্রিং এর মাঝখানে হয়।


[1] রেফ: 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;
}

4
প্রশ্ন সম্পর্কে printf, ব্যাশ, না সি
সকল ওয়ার্কার্স অপরিহার্য
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.