Printf ile renkleri kullanma


94

Bu şekilde yazıldığında, metni mavi olarak verir:

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

Ama printf'de format tanımlı olmasını istiyorum:

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

Şimdi, başarılı olmadan nasıl renk ekleneceğini birkaç seçenek denedim:

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

Başarısız biçime öznitelik kodu bile eklemeye çalıştım. Bu işe yaramıyor ve benim durumumdaki gibi formatı tanımlayan printf'e renklerin eklendiği bir örnek bulamıyorum.

Yanıtlar:


81

Parçaları temiz bir şekilde ayırmak yerine birbirine karıştırıyorsunuz.

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

Temel olarak, sabitleri biçime ve değişkenleri parametrelere koyun.


Buradaki bazı ekstra ayrıntılar: Komut printf, bir biçim dizesi ve biçime göre yazdırılan bir bağımsız değişken listesinden oluşur. Renkleri biçim dizesinin bir parçası olarak görmelisiniz ve bu nedenle, biçim dizesine ait olmalıdırlar.
kvantour

harika cevap, soruna
Steven Penny

179

Arkaik terminal kodlarını kullanmak yerine, aşağıdaki alternatifi önerebilir miyim? Yalnızca daha okunabilir kod sağlamakla kalmaz, aynı zamanda renk bilgilerini, orijinal olarak amaçladığınız gibi biçim belirticilerinden ayrı tutmanıza da olanak tanır.

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

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

Ek renkler için cevabımı BURADA görün


1
//, Bu aynı zamanda kodların ne anlama geldiğini belgelemek zorunda kalmamamı da sağlıyor. Grubumuzun senaryoları dokümanlar olarak görmesine yardımcı olmak için ileriye dönük bir adım olacağını düşünüyorum.
Nathan Basanese

37

Bu benim için çalışıyor:

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

Kimden printf(1):

%b     ARGUMENT as a string with '\' escapes interpreted, except that octal
       escapes are of the form \0 or \0NNN

printf "\ e [1; 34mBu bir mavi metin. \ e [0m" benim için de aynısını yapıyor.
PintoDoido

20

Bu, terminalde farklı renk elde etmek için küçük bir programdır.

#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
bu c ve bash değil.
eav

14

Bu, bash komut dosyası kullanarak renkli metin yazdıran küçük bir işlevdir. İstediğiniz kadar stil ekleyebilir ve hatta sekmeler ve yeni satırlar yazdırabilirsiniz:

#!/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'a gönderilen kodun yeniden kullanımına ilişkin politikanız nedir?
Daisuke Aramaki

2
@DaisukeAramaki Sorduğunuz için teşekkürler. Dilediğiniz şekilde ve istediğiniz yerde kullanabilirsiniz. MIT lisansı altında. İşbirliği yapmak istiyorsanız, geliştirmeleri Gist'e
Arian Acosta

3

Bu c kodunu renkli kabuk çıktısını yazdırmak için kullanıyorum. Kod bu gönderiye dayanmaktadır .

//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.1altta bir not vardır: "... kabuğunuzun kendi sürümü olabilir printf...". Bu soru için etiketlendi bash, ancak mümkünse herhangi bir kabuğa taşınabilir komut dosyaları yazmaya çalışıyorum . dashtaşınabilirlik için iyi bir asgari taban çizgisi genellikle - cevap burada çalışır böylece bash, dash&zsh . Bir betik bu 3'te çalışıyorsa, büyük olasılıkla hemen hemen her yere taşınabilir.

[1] 'printf deki en son uygulama, ANSI kaçış karakterine sahip bir biçim belirticisi verildiğinde çıktıyı renklendirmez - ancak sekizlik (ASCII'ye eşdeğer) ile birleştirilmiş bir biçim belirticisi işi bitirir. Lütfen aykırı değerler için yorum yapın, ancak AFAIK, tüm mermiler ASCII sekizlik alt kümesini minimumda kullanmak için uygulanmıştır .dash%s\e%b\033ESCprintf

"Printf ile renkleri kullanma" sorusunun başlığına göre, biçimlendirmeyi ayarlamanın en taşınabilir yolu, %bbiçim belirticisini printf( @Vlad'dan daha önceki bir yanıtta belirtildiği gibi ) sekizlik kaçış ile birleştirmektir \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"

Çıktılar:

$ ./portable-color.sh
-> This is \033[1;34m blue   \033[0m text
-> This is  blue    text

... ve 'mavi' ikinci satırda mavidir.

OP'deki %-6sbiçim belirleyicisi, açma ve kapama kontrol karakter dizileri arasındaki biçim dizesinin ortasındadır.


[1] Ref: man dashBölüm "Yerleşikler" :: "printf" :: "Biçim"


-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
Soru Bash'deki printf ile ilgili , C ile değil.
All Workers Are Essential
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.