정규식

정규식

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;

관련 정보