カラー印刷のための複数の色宣言処理[閉じる]

カラー印刷のための複数の色宣言処理[閉じる]

複数行の変数をcolorで印刷する作業を単純化したいと思いますawk

var="
Blu:
  Some text in blue here
  Some more blue text

Grn:
  Some green text here
  More green text"

awk \
  'BEGIN {
     "tput sgr0" |& getline sgr
     "tput bold; tput setaf 15"  |& getline wht
     "tput bold; tput setaf 34"  |& getline grn
     "tput bold; tput setaf 39"  |& getline blu
     "tput bold; tput setaf 11"  |& getline ylw
     "tput bold; tput setaf 196" |& getline red
     "tput bold; tput setaf 214" |& getline amb

     "tput bold; tput setaf 51"  |& getline cyn
     "tput bold; tput setaf 201" |& getline mgn
   }
   
   /Wht:$/ { kw=1 ; next }
   /Grn:$/ { kg=1 ; next }
   /Blu:$/ { kb=1 ; next }
   /Ylw:$/ { ky=1 ; next }
   /Red:$/ { kr=1 ; next }
   /Amb:$/ { ka=1 ; next }
   /Cyn:$/ { kc=1 ; next }
   /Mgn:$/ { km=1 ; next }

   !NF { kw=0 ; kg=0 ; kb=0 ; ky=0 ; kr=0 ; ka=0 ; kc=0 ; km=0
         next }
   kw { printf("%s%s%s\n", wht, $0, sgr) }
   kb { printf("%s%s%s\n", blu, $0, sgr) }
   ky { printf("%s%s%s\n", ylw, $0, sgr) }
   kr { printf("%s%s%s\n", red, $0, sgr) }
   ka { printf("%s%s%s\n", amb, $0, sgr) }
   kc { printf("%s%s%s\n", cyn, $0, sgr) }
   km { printf("%s%s%s\n", mgn, $0, sgr) }
  ' <<< "$var"

ベストアンサー1

確立された私の答え前の質問に進み、前の質問で何をしたのか、現在のコードが何をしたいのかを考えてみましょう。

$ cat tst.sh
#!/usr/bin/env bash

var="
Blu:
  Some text in blue here
  Some more blue text

Grn:
  Some green text here
  More green text"

awk '
    BEGIN {
        n = split("Wht 15 Grn 34 Blu 39 Ylw 11 Red 196 Amb 214 Cyn 51 Mgn 201",tputColors)
        for ( i=1; i<n; i+=2 ) {
            colorName = tputColors[i] ":"
            colorNr = tputColors[i+1]

            cmd = "tput setaf " colorNr
            fgEscSeq[colorName] = ( (cmd | getline escSeq) > 0 ? escSeq : "<" colorName ">" )
            close(cmd)
        }

        cmd = "tput sgr0"
        colorOff = ( (cmd | getline escSeq) > 0 ? escSeq : "<sgr0>" )
        close(cmd)

        fgColor = dfltFgColor = "Grn:"
    }

    /^[[:alpha:]]+:/ && ($1 in fgEscSeq) { fgColor = $1; next }
    !NF { fgColor = dfltFgColor; next }
    { print fgEscSeq[fgColor] $0 colorOff }
' <<< "$var"

tput使用している番号に電話をかけた結果、私の端末では何の色も出ていないので、どうなるかをお見せすることはできませんが、おそらくお客様の端末では動作するようです。以下は、生成されたエスケープシーケンスを示す出力です。

$ ./tst.sh | cat -v
^[[339m  Some text in blue here^[(B^[[m
^[[339m  Some more blue text^[(B^[[m
^[[334m  Some green text here^[(B^[[m
^[[334m  More green text^[(B^[[m

ちなみに、ご利用をご検討の方はgetline必ずお読みになり、完全にご理解ください。http://awk.freeshell.org/AllAboutGetlineいつ、どのように正しく使用するかをご覧ください。コードはGNUに固有の必要はない補助プロセスを使用して呼び出し、失敗してパイプを閉じたり殺したりしない場合は自動的に入力するように呼び出します。スクリプトが終了する前にスピンオフしたいプロセスに色が正しくありません。呼び出す正確で移植可能な方法については、私のコードをご覧ください。

おすすめ記事