내 입력에는 표로 작성하려는 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
또는htmltidy
HTML을 브라우저에 전달하기 전에 삭제하세요.
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