处理彩色打印的多种颜色声明

处理彩色打印的多种颜色声明

我想简化使用彩色打印多行变量的任务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 的,并且你以一种方式调用它,如果它失败并且你没有关闭管道或杀死它,那么你只是默默地填充错误的颜色在脚本结束之前您要分拆的进程,请参阅我的代码以获取正确且可移植的调用方式。

相关内容