tcsh 스크립트에 '\n'으로 구분되고 내부에 공백이 있을 수 있는 문장 목록이 있습니다. ls 스타일로 표시하고 싶어서 "echo $list|column"을 실행했습니다. 색상을 사용하지 않을 때 효과적입니다. 결과는 다음과 같습니다
그런 다음 매번 변경되는 일부 항목(최근 3개 선택 사항)을 강조 표시해야 합니다. 강조 표시하려는 항목 주위에 색상 시퀀스(\e[33m 및 \e[0m)를 추가하고 이를 $list에 넣습니다. "echo $list|column"으로 표시하면 색상은 괜찮지만 아래 이미지에 표시된 대로 텍스트가 정렬되지 않습니다.
'|column'을 사용하지 않고 시도했는데 문자열이 내가 원하는 스타일이 아니더라도 한 열에 올바르게 표시된다는 점에 유의하세요.
문제에 대한 해결책이 있습니까?
그런데 검색을 좀 해보니 해당 열에 버그가 있는 것 같습니다. 이 열에 관리자가 있나요? 문제를 어디에 신고해야 합니까?
참고: 읽었습니다.열 명령 및 색상 이스케이프 코드 관련 문제게시하기 전에. 그의 형식은 고정되어 있지만 내 컬러 프로젝트는 동적입니다. 따라서 단순히 printf를 사용하거나 열 뒤에 색상을 추가하면 작동하지 않습니다.
답변1
출력에 색상을 지정하는 이스케이프 시퀀스는 이해되지 않으며 column
입력에서 "인쇄 가능한 문자"를 계산해야만 이해됩니다. 예를 들어, 텍스트를 녹색( )으로 바꾸는 시퀀스에는 ^[[0;32m
인쇄 가능한 문자 6개가 포함되어 있으며 그렇게 계산됩니다.
column
열 너비를 결정할 때 실제로 표시되는 내용을 확인하려면 다음을 시도해 보세요.
ls --color=always / | tr -dc '\n -~' | column -s '\n'
이 옵션을 지원하지 않으면 ls --color=always /
모든 명령을 컬러 출력으로 대체하십시오.ls
column
이러한 이스케이프 시퀀스를 무시할 설득력은 없지만 나중에 색상을 추가할 수 있습니다.
to-list
다음과 같은 파일이 있다고 가정해 보겠습니다.
1: avifsc01
2: avifsh01_bg4dtva0f
3: avifsh01_bg5dtvz1f
4: bg2ctqz1
5: bg2dtva0
6: bg3cda0
7: bg3cda1
8: bg3cdpa0
9: bg3z1
10: bg4cdpa0f
11: bg4cdpz1f
12: bg4cdz1f
13: bg4cta0f
14: bg4ctpa0f
15: bg4ctpz1f
16: bg4ctz1f
17: bg4dtva0f
18: bg4dtvz1f
19: bg5ctpz1f
20: bg5ctz1f
21: bg5dtvz1f
22: bg6ctz1f
23: bgpk01
24: dsc
25: test
26: vpp01
27: vrdlib01
그런 다음 다음을 수행할 수 있습니다.
list=$(cat to-list)
특정 항목에 색상을 지정하고 싶다고 가정해 보겠습니다.
to_color='bg3cda0 bg4dtva0f bg6ctz1f'
column
목록을 색칠하기 전에 형식을 지정할 수 있습니다.
printf '%s\n' "${list}" \
| column -s '\n' \
| sed "s@$( (printf '%s\\|' ${to_color}; echo) \
| sed 's@^@\\([0-9][0-9]*: \\(@' \
| sed 's@\\|$@\\)\\)@' \
)@$(printf '\033')[33m\1$(printf '\033')[0m@g"
${list}
두 변수( 및 ) 를 생성할 수 있는 방법이 있는 한 ${to_color}
이러한 항목은 동적으로 생성될 수 있습니다 .
결과:
답변2
색상 순서는 문자 수를 뒤섞기 column
때문에 다음과 같이 열 단계 뒤에 색상을 추가할 수 있습니다.
set items2color = ( "bg3cda0" "bg4dtva0f" "bg6ctz1f" )
echo "$list" | column |\
perl -slpe '\
for my $c ( split /\s+/, $C ) {\
s/(?:(?<=^)|(?<=\t))\d+:\s+\Q$c\E(?=\t|$)/\e[31m$&\e[0m/;\
}\
' -- -C="$items2color"
색상화하려는 특정 항목은 명령줄의 options 에 배치되지만 -C
이름을 변경할 수 있으며 Perl은 $C 변수를 통해 해당 이름을 사용할 수 있습니다. 공백으로 구분된 항목 목록이므로 공백으로 분할하고 정규식을 현재 줄에 적용합니다. 줄 끝에 있는 백슬래시는 작업 중인 목록 변수 tcsh
라고 말했기 때문입니다.tcsh
정규식
정규식의 간략한 작업은 다음과 같습니다. 정규식은 어떤 변수에도 연결되지 않으므로 이는 $_ 변수(우리의 경우 현재 줄)에 연결된다는 의미입니다.
/
(?: # From where we are,
(?<=^) # we see the beginning of the current line to our left
| # OR
(?<=\t) # we see a TAB to our left
)
# We are the beginning of a digit
\d+: # followed by one or more digits, ending in a colon
\s+ # then atleast one whitespace
\Q$c\E # followed by the item to be colored. \Q...\E quote the $c should
# it comprise any characters which mean something to the regex.
(?= \t | $ ) # we see a TAB or the end of line to our right
/x;