입력 색상이 있는 열을 사용하는 방법은 무엇입니까?

입력 색상이 있는 열을 사용하는 방법은 무엇입니까?

입력 색상을 사용하면 열 출력을 방해하는 것 같습니다. 왜 이런 일이 발생하며 더 중요한 것은 해결책이 있습니까?

$ {
  echo "$(tput bold)foo$(tput sgr0)" "$(tput bold)bar$(tput sgr0)"
  echo bar foo
} | column -t
foo  bar
bar                     foo

macos와 ubuntu 20.04에서 문제를 재현했지만 둘 다 BSD 열을 사용하는 것 같습니다.

답변1

파이프를 통해 cat -v해당 파일 스트림의 모든 문자를 볼 수 있습니다. column너비를 계산하는 데 사용합니다.

^[[1mfoo^[(B^[[m ^[[1mbar^[(B^[[m
bar foo

올바른 접근 방식은 모든 콘텐츠 생성을 모든 형식(예: MVC 모델)에서 분리하는 것입니다. 탭과 같은 출력을 생성하기 위해 공백이 추가 되므로 column내용이 수정됩니다. 또한 tput터미널에 명령을 추가합니다. 이러한 작업을 분리함으로써 출력을 파일에 저장하거나 포맷 기능에서 전달하여 콘솔로 보내거나 다른 대상을 위해 포맷할 수 있습니다.


그러나 너비 계산에서 특정 문자를 제외하는 awk것도 좋은 연습입니다 . column -t아래에서 사용하는 정규식은 많은 tput것을 포착하지만 모든 것이 아니라는 것을 거의 확신합니다.

$ cat tst.awk
BEGIN {
    OFS = "  "
}

{
    nr = NR
    for (i=1;i<=NF;i++) {
        f[NR,i] = $i
        gsub(/\x1B[^[:alpha:]]+[[:alpha:]]/,"",$i)
        if (length($i) > col[i]) col[i] = length($i)
    }
}

END {
    for (i=1;i<=nr;i++) {
        for (j=1;j<=length(col);j++) {
            printf "%-"col[j]"s%s", f[i,j], (j==length(col)? ORS : OFS)
        }
    }
}

그런 다음 첫 번째 출력을 파이프로 연결합니다.awk -f tst.awk

답변2

${
    echo -e "$(tput 굵게)foo$(tput sgr0)" "$(tput 굵게)bar$(tput sgr0) baz";
    에코 바 리치;
  } |고양이 -v
^[[1mfoo^[(B^[[m ^[[1mbar^[(B^[[m baz)
풍부한 바

문제는 tput sgr0아시다시피 기본적으로 tputs이스케이프 코드가 환경 변수에서 얻은 터미널 유형을 기반으로 사용된다는 것입니다 TERM.

이렇게 하면:

infocmp -1 |grep -E 'bold|sgr0'
    bold=\E[1m,
    sgr0=\E(B\E[m,

너는 무엇을 볼 것인가?용감한그리고sgr0코드는 ANSI가 아닌 이스케이프 값이며 for 및 for cat -v로 변환한 후 출력에서 ​​볼 수 있듯이 명령은 동일한 작업을 수행하고 ANSI 이스케이프 유형 코드로 확인되지만 존재하고 유지되면 실패하고 인식되지 않습니다. ANSI에서 이스케이프되어 최종 출력이 예상대로 올바르게 열화되지 않게 됩니다.^[[1mtputs bold^[(B^[[msgr0column(B^[(B^[[m

이렇게 하면:

infocmp -1 -T ansi |grep -E 'bold|sgr0'
        bold=\E[1m,
        sgr0=\E[0;10m,

각각에 대해 동등한 ANSI 이스케이프 코드를 찾을 수 있으므로 이를 해결할 수 있는 두 가지 옵션이 있습니다.

  1. tputs위의 ANSI 이스케이프 코드로 바꾸세요 .

    { 
      echo -e "\033[1mfoo\033[0;10m" "\033[1mbar\033[0;10m baz";
      echo bar foo;
    } |column -t
    
  2. 터미널 유형을 다음으로 전달합니다 tputs.

    {
      echo -e "$(tput bold)foo$(tput -T ansi sgr0)" "$(tput bold)bar$(tput -T ansi sgr0) baz";
      echo bar foo;
    } |column -t
    

답변3

columnUbuntu 18.04를 실행 중인데 예상대로 작동하지 않는 동작으로 인해 혼란스럽습니다. 다른 사람들이 제안한 것처럼 문제는 창고에 골동품이 있다는 것입니다.

최신 버전을 구하는 유일한 방법은 다음과 같습니다.util-linux환매 계약.

-V아직 가져오기 버전이 추가되지 않았기 때문에 이를 파악하기 어렵습니다 ! 아마도 더 우아한 방법이 있을 것입니다. 그러나 man column하단의 날짜를 "2004년 7월 29일"로 지정하여 대략적인 버전을 추론했습니다. 비교하다2004 맨페이지도착하다2019 맨페이지. 전자는 단지 설명하지만4개옵션, 후자는 거의두 다스!

또한 MacOS Catalina에서도 똑같은 결과를 얻었다고 말할 수 있습니다. brew최신 버전이 포함된 패키지를 찾을 수 없지만 column아마도 어딘가에 숨겨져 있을 것입니다.

최신 버전에 액세스할 수 없는 경우 기존 버전에 해당하는 매뉴얼 페이지를 확인해야 합니다. 그렇지 않으면 상황이 답답해질 수 있습니다!

관련 정보