printfで色を使用する


90

このように書くと、テキストが青で出力されます。

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に色が追加されている例はどこにも見つかりません。

回答:


79

パーツをきれいに分離するのではなく、パーツを混ぜ合わせています。

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

基本的に、固定のものをフォーマットに入れ、変数のものをパラメーターに入れます。


あなたの答えをありがとう。知らなかった、その文字列の長さのフォーマットは色の属性の間に置かれなければならない。
Jernej Jerin 2011年

このフォーマット方法(これは私にとっては新しいことです); これはすべて標準ですか?
チャニ2014年

@Chaniprintfコマンドはprintf()、C言語の関数をモデルにしています。最初のパラメータ/引数は常にformatすべてのフォーマット(そしておそらく色も)を含む文字列であり、残りのパラメータはデータです。特定のスタイルでテキストを出力したい場合は、すべてのフォーマットとカラーエスケープをフォーマット文字列に入れるのが理にかなっています。フォーマット文字列は信頼できると見なされ、ユーザー入力を含めるべきではないことに注意してください。
ミッコランタライネン

ここにいくつかの追加の詳細があります:コマンドprintfは、フォーマット文字列フォーマットに従って出力される引数リストで構成されています。色はフォーマット文字列の一部として表示されるはずなので、フォーマット文字列に属している必要があります。
kvantour

177

古風な端末コードを使用するのではなく、次の代替案を提案できますか。より読みやすいコードを提供するだけでなく、当初の意図どおりに色情報をフォーマット指定子から分離しておくこともできます。

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

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

追加の色については、ここで私の答えを参照してください


1
//、これにより、コードの意味を文書化する必要がなくなります。私たちのグループがスクリプトをドキュメントとして見るのを助けるための一歩になると思います。
Nathan Basanese 2017年

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これは青いテキストです。\ e [0m"は私にとってまったく同じことをします。
PintoDoido

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であり、bashではありません。
eav 2017

14

これは、bashスクリプトを使用して色付きのテキストを印刷する小さな関数です。必要な数のスタイルを追加でき、タブや新しい行を印刷することもできます。

#!/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お問い合わせいただきありがとうございます。好きな方法でどこでも使用できます。それはMITライセンスの下にあります。あなたが協力する必要がある場合は、要旨の改善を提出すること自由に感じ:gist.github.com/arianacosta/d6d1c521d231cc09ec5fe850ae2f5be1
牡羊座生まれのアコスタ

5

この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;
}

2

man printf.1下部に「...シェルには独自のバージョンのprintf...がある可能性があります」という注記があります。この質問にはタグが付けられていますがbash、可能であれば、任意のシェルに移植可能なスクリプトを作成しようとしています。 dash通常、移植のための良好な最低限のベースラインである-ので、ここで答えはで動作しbashdashzsh。スクリプトがこれらの3で機能する場合、ほとんどの場合、ほぼどこにでも移植できます。

最新の実装printfではdash、[1]が与えられ色付け出力しない%sANSIのエスケープ文字と書式指定子\e-しかし、書式指定子%b進と組み合わせる\033(ASCIIと同等のESC)仕事を得るでしょう。外れ値についてコメントしてください、しかしAFAIK、すべてのシェルは実装されていますprintfASCII8進数サブセットを最小限で使用するています。

「printfで色を使用する」という質問のタイトルに対して、フォーマットを設定する最も移植性の高い方法は%bprintf(@ Vladからの以前の回答で参照されている)のフォーマット指定子を8進数のエスケープと組み合わせること\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

...そして「青」は2行目の青です。

%-6sOPのフォーマット指定子は、開始制御文字シーケンスと終了制御文字シーケンスの間のフォーマット文字列の中央にあります。


[1]参照:man dashセクション「Builtins」::「printf」::「Format」


-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
質問は約れprintfのバッシュでは、ないC.
すべての労働者には必要不可欠である
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.