ANSI 이스케이프 코드가 포함된 입력 데이터를 "표로 작성"하기 위한 쉘 도구

ANSI 이스케이프 코드가 포함된 입력 데이터를 "표로 작성"하기 위한 쉘 도구

내 입력에는 표로 작성하려는 ANSI 색상 코드가 포함되어 있습니다. 출력의 색상을 유지하고 싶으므로 표 형식의 출력은 ANSI 색상 코드를 유지해야 합니다. 그래서 순진하게 그것들을 벗겨내는 것은 나에게 잘 맞지 않습니다.

예를 들어, 이 입력의 경우

\033[0;32;1mgreen_apple\033[0m 1 100
orange 20 19
pineapple 1000 87
avocado 4 30

내가 기대하는 결과는 다음과 비슷합니다.

green_apple 1    100
orange      20   19
pineapple   1000 87
avocado     4    30

위 출력에서 ​​"green_apple"은 입력 색상 코드(예: 녹색)에 따라 색상이 지정되어야 합니다. 나는 이것을 달성하는 방법을 알고 싶습니다.

해당 열을 시도했지만 ANSI 코드를 처리하지 않습니다. 산출

echo '\033[0;32;1mgreen_apple\033[0m 1 100
orange 20 19
pineapple 1000 87
avocado 4 30' | column -t

안타깝게도

green_apple  1     100
orange                  20    19
pineapple               1000  87
avocado                 4     30

표 형식이 아니라는 점에 유의하세요.

답변1

그런 명령은 없고 수동으로 해야 한다고 생각합니다. 그것은 다음과 같습니다:

awk '
  {
    nf[NR]=NF
    for (i = 1; i <= NF; i++) {
      f[NR,i] = $i
      gsub(/\033\[[0-9;]*[mK]/, "", $i)
      len[NR,i] = l = length($i)
      if (l > max[i]) max[i] = l
    }
  }
  END {
    for (n = 1; n <= NR; n++) {
      for (i = 1; i < nf[n]; i++)
        printf "%s%*s", f[n,i], max[i]+1-len[n,i], ""
      print f[n,nf[n]]
    }
  }'

답변2

관심 있는 분들을 위해 이 awk 스크립트를 적용했습니다.Stefan Chazeras의 답변. 이를 컴퓨터에 놓고 $PATH명령줄에서 실행할 수 있어야 합니다.

예를 들어:

> echo -e '\e[32mHello\e[0m,World\nFoo,Bar' | colorcolumn FS=',' OFS=' | '
Hello | World
Foo   | Bar
#!/usr/bin/awk -f
#
# colorcolumn - Like `column`, but works with ANSI colors
#
# Based on this Stack Exchange answer by Stephane Chazelas:
#     https://unix.stackexchange.com/a/121139/259233

{
    nf[NR]=NF
    for (i = 1; i <= NF; i++) {
        cell[NR,i] = $i
        gsub(/\033\[([[:digit:]]+(;[[:digit:]]+)*)?[mK]/, "", $i)
        len[NR,i] = l = length($i)
        if (l > max[i]) max[i] = l
    }
}
END {
    for (row = 1; row <= NR; row++) {
        for (col = 1; col < nf[row]; col++)
            printf "%s%*s%s", cell[row,col], max[col]-len[row,col], "", OFS
        print cell[row,nf[row]]
    }
}

답변3

물론 문제는 column인쇄 문자와 인쇄되지 않는 문자를 구별하는 것이 아닙니다. 이 문제를 프롬프트() 및 이스케이프 기능으로 해결하려면 bash다른 방법을 모르겠습니다.PS1\[ \]

문제 도메인이 다음 위치에 있다고 가정하면시작해당 줄의 다음으로 이동하세요., 그러나 일반적인 유틸리티를 사용하여 쉽게 해결할 수 없는 유사한 패딩/정렬 문제에 직면하게 됩니다.

ls -l --color | rev | column -t  | rev   # not a useful solution

Perl 모듈이 설치되어 있으면 HTML::FromANSI유용한 스크립트가 있습니다 ansi2html:

ls -l --color | ansi2html -f

이것은 전투의 절반만 가져왔습니다. 이제 HTML 출력을 정렬해야 합니다...

HTML을 중간에 배치하는 간단한(약간 무겁기는 하지만) 솔루션이 있습니다. HTML 테이블의 레이아웃은 실제로 원하는 것입니다.

이는 다음을 사용합니다.앙드레 사이먼~의안티필터,예를 들어:

ls -l --color | ansifilter -fH

이는 ANSI 시퀀스를 HTML( <span style="..."></span>)로 변환하며, 이는 텍스트 모드 ANSI를 지원하는 브라우저에서 사용할 수 있습니다(예:전자 링크.

불완전한 HTML이 문제인 경우 다음을 실행하도록 선택할 수 있습니다.hxclean또는htmltidyHTML을 브라우저에 전달하기 전에 삭제하세요.

ls -l --color  | ansifilter -fH | perl table.pl | elinks -dump -dump-color-mode 1 

당신은 사용할 수 있어야합니다전자 링크또는w3m 이를 위해

스크립트 table.pl는 공백으로 분할하고 관련 HTML 테이블 태그를 추가하여 원하는 형식을 얻습니다.

print "<table>\n";
while (<>) { 
    print "<tr><td>" . 
      join("</td><td>", split(/((?!<[^>]+)\s+(?![^<]+>))/) ) . 
      "</td></tr>\n"; 
}
print "</table>\n";

하지만 사실은 그렇지 않아요오직공백으로 분할되면 "<"">" 꺾쇠 괄호 내부가 아닌 공백으로 분할되므로 태그가 깨지지 않습니다 <span>. 이는 HTML을 구문 분석하는 좋은 방법은 아니지만 여기의 제한된 입력 유형에는 충분합니다.

기본 색상을 설정 또는 재정의하거나 파일에 추가하려면 (내가 그랬습니다) 필요할 수 있습니다 ~/.elinks/elinks.conf.

set document.colors.use_document_colors = 1
set document.colors.text = "#000000"
set document.colors.background = "#ffffff"

최신(0.12.x) elink를 사용하십시오. 이전 버전은 ANSI 컬러 출력을 지원하지 않습니다.

답변4

과일 이름에는 _alphabetic문자만 포함되어 있다고 가정합니다.

c='(\e|\\033)\[[0-9;]+m'
sed -r "s/^($c)?([a-zA-Z_]+)($c)?/& \3/" file | column -t | 
sed -r "s/^($c[a-zA-Z_]+$c)( +)([a-zA-Z_]+)/\5\4\1/" |
sed -r "s/^[^ ]+ +//"

산출:

\033[0;32;1mgreen_apple\033[0m  1     100
orange       20    19
pineapple    1000  87
avocado      4     30

출력을 컬러로 표시하려면 (테스트 printf)관로통과하다쉘 명령 대체,예를 들어:

c='(\e|\\033)\[[0-9;]+m'; printf "$(
sed -r "s/^($c)?([a-zA-Z_]+)($c)?/& \3/;" file | column -t | 
sed -r "s/^($c[a-zA-Z_]+$c)( +)([a-zA-Z_]+)/\5\4\1/" |
sed -r "s/^[^ ]+ +//" )"

컬러로 출력 –오직 녹색 사과컬러로 표시됩니다.

green_apple  1     100
orange       20    19
pineapple    1000  87
avocado      4     30

관련 정보