printfの「%* s」パディング形式に影響を与えずに端末でフォントの色を変更できますか?

printfの「%* s」パディング形式に影響を与えずに端末でフォントの色を変更できますか?

message_offsetbashスクリプトのステータスを印刷するbashスクリプト機能があります。
つまり、次のようにメッセージとステータスを渡して呼び出すことができます。

message_offset "install font library" "[   OK   ]" 

常に80列幅の一番右の文字を設定するために使用される形式printfで端末に印刷されます。たとえば、出力は次のようになります。%*s[ OK ]

install font library                              [   OK   ]
update configuration file on server               [   ERR  ]
                                                           ^
                                                           |
                                                      always
                                                        at 80

以下を使用すると、echo出力は次のようになります。

install font library                 [   OK   ]
update configuration file on server               [   ERR  ]

パスワード:

#!/usr/bin/env bash

function message_offset() {

    local message="$1"
    local status="$2"

    # compensate for the message length by reducing the offset 
    # by the length of the message, 
    (( offset = 80 - ${#message} ))

    # add a $(tput sgr0) to the end to "exit attributes" whether a color was
    # set or not
    printf "%s%*s%s" "${message}" 80 "$status" "$(tput sgr0)"

}

tputを使用して文字列にいくつかのカラーシーケンスを追加しようとするまで、これはすべてうまくいきます。これにより「[ERR]」が赤色に変わります。フォーマットはオフセットを設定するときにtput文字の順序を計算する
ようですので、printf "%*s"関数を呼び出すと

message_offset "update configuration file on server"  "$(tput setaf 1)[   ERR  ]"

出力は次のようになります。

install font library                              [   OK   ]
update configuration file on server          [   ERR  ]

この文字列にはすべての文字と文字がprintf "%*s"含まれていますが、明らかに文字は印刷されないため、実際にはパディングには影響しません。 「ステータス」メッセージに色を追加し、スタイルの色順を使用する方法はありますか?"[ ERR ]""$(tput setaf 1)"$(tput setaf 1)
tput

答え1

必要以上に複雑にしています。$messageANSIシーケンスの幅を考慮せずにソートを処理できます。

#! /usr/bin/env bash

message() {
    [ x"$2" = xOK ] && color=2 || color=1
    let offset=$(tput cols)-4-${#2}
    printf "%-*s[ %s%s%s ]\n" $offset "$1" "$(tput setaf "$color")"  "$2" "$(tput sgr0)"
}  

message "install font library" "OK"
message "update configuration file on server" "ERR"

編集する:ほとんどのprintf(1)実装では、マルチバイト文字セットの長さの計算を正しく処理できません。したがって、UTF-8形式のアクセント文字を含むメッセージを印刷するには、他のアプローチを取る必要があるかもしれません。肩をすくめる

答え2

簡単な方法はすべてを着色することです後ろにすでに並んでいます。

簡単に言えば、あなたは必要です

  • 文字列を色で色付けする関数(またはより良い外部スクリプト)(Perls,$regex,$color$&$resetcolor,gi

  • あなたはそれを呼び出す後ろに印刷しました。カラーエスケープコードはこのようにソートを変更しません。

たとえば、カラーパラメータを使用し、その後にその色で色を付けたい正規表現を使用する「colorize」というスクリプトを生成するとします。たとえば、colorize -blue 'regex1' -green 'regex2' 必要に応じて呼び出します。

 { code
   that
  formats and display things
 } | colorize -red 'ERR' -green 'OK'

スクリプト自体として使用すると、どこでも使用できます。たとえば、次のようになります。

 df -h | colorize -red '[890].%'

関連情報