컬러 인쇄를 위한 여러 색상 선언 처리 [닫기]

컬러 인쇄를 위한 여러 색상 선언 처리 [닫기]

여러 줄의 변수를 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에 특정할 필요는 없는 보조 프로세스를 사용하여 호출하고, 실패하고 파이프를 닫거나 죽이지 않으면 자동으로 채우는 방식으로 호출합니다. 스크립트가 끝나기 전에 스핀오프하려는 프로세스에 색상이 잘못되었습니다. 호출하는 정확하고 이식 가능한 방법은 내 코드를 참조하세요.

관련 정보