저는 macOS 12.3.1을 실행하고 있습니다.
.zshrc에 몇 줄을 추가했습니다.
export GREP_OPTIONS='--color=always'
export GREP_COLOR='1;35;40'
나중에 grep 출력을 tr로 파이프하면 동일한 수의 행이 반환되지만 모든 행은 비어 있습니다.
예를 들어:
grep ^.....$ /usr/share/dict/words | tr "[:lower:]" "[:upper:]"
10230개의 빈 행을 반환합니다.
이것이 예상되는가?
답변1
색상 일치를 출력하려면 grep
일치 전후에 색상 이스케이프 시퀀스를 작성하십시오.
이는 터미널에 배경색 및/또는 전경색을 변경하도록 지시하는 지침입니다.
그것을 깨닫는 것이 중요하다예텍스트와 함께 출력에 나타납니다. 터미널이 이를 그래픽 기호로 표시하지 않고 특수 지침으로 이해하기 때문에 이를 볼 수 없습니다.
이스케이프 시퀀스는 ESC 문자(0x1b 바이트(8진수로 033), ASCII라고도 함 \e
또는 ^[
)로 시작하고 그 뒤에는 제어 문자일 필요가 없는 일부 문자가 옵니다.
출력을 다음으로 파이프하여 이러한 문자를 표시할 수 있습니다.
$ echo + | grep --color=always . | sed -n l
\033[01;31m\033[K+\033[m\033[K$
$ echo + | grep --color=always . | od -An -vtc -tx1 -to1
033 [ 0 1 ; 3 1 m 033 [ K + 033 [ m 033
1b 5b 30 31 3b 33 31 6d 1b 5b 4b 2b 1b 5b 6d 1b
033 133 060 061 073 063 061 155 033 133 113 053 033 133 155 033
[ K \n
5b 4b 0a
133 113 012
(여기에는 개별 바이트의 16진수 및 8진수 값도 포함됩니다)
또는 (비표준적이고 불분명하지만):
$ echo + | grep --color=always . | cat -A
^[[01;31m^[[K+^[[m^[[K$
출력에서 사전 일치와 사후 일치가 grep
있음을 확인할 수 있습니다.\e[01;31\e[K
\e[m\e[K
주어진 터미널이 인식하는 이스케이프 시퀀스와 터미널마다 어떻게 다른지. 예를 들어, xterm의 경우 다음을 참조하세요.거기 사양. 위의 내용은 요즘 꽤 흔합니다.
\e[
- 로 시작하고 끝나는 숫자의 경우 m
터미널은 ;
- 로 구분된 각 숫자를 이제부터 작성되는 텍스트에 적용할 다른 렌더링 속성으로 이해합니다. 예를 들어 1
굵게 표시하려면 31
전경색을 빨간색으로 설정하세요.
\e[K
커서부터 줄 끝까지 화면을 지우도록 터미널에 지시하는 이스케이프 시퀀스입니다.
따라서 터미널은 실제로 다음을 확인합니다.
<bold-fg_red><clear-to-eol>+<reset-all-attributes><clear-to-eol>
하지만 당신이 tr
보는 것은 ESC, [
... m
및 음역이 필요한 기타 콘텐츠뿐입니다.
특히 여기서는 음역 m
되어 M
색상 속성을 변경하는 이스케이프 시퀀스가 모두 다른 것으로 변합니다.
터미널 문서(예:https://www.invisible-island.net/xterm/ctlseqs/ctlseqs.html위에서 언급한 xterm)은 때때로 찾기 어렵거나 존재하지 않는 경우 terminfo
일부 일반적인 작업에 대해 터미널에서 인식되는 일부 이스케이프 시퀀스를 기록하는 데이터베이스를 볼 수도 있습니다.
다음 명령을 사용하여 터미널의 데이터베이스( $TERM
환경 변수로 식별됨) 를 수동으로 쿼리할 수 있습니다 infocmp
.
$ infocmp -xL1 | grep M,
delete_line=\E[M,
key_enter=\EOM,
key_mouse=\E[M,
parm_delete_line=\E[%p1%dM,
scroll_reverse=\EM,
이러한 작업에 대한 세부정보(능력terminfo(5)
), 매뉴얼 페이지( )를 볼 수 있습니다 man 5 terminfo
.
\e[M
( delete_line
)는 행을 삭제하고, \e[<decimal>M
( parm_delete_line
)는 <decimal>
행을 삭제합니다. 따라서 일단 대문자로 음역하면 음영 시퀀스는 줄 삭제 시퀀스가 됩니다.
일반적으로 컬러 출력은 터미널용으로만 사용되므로 후처리를 원하지 않습니다. 이것이 색상 지정을 지원하는 대부분의 명령이 출력이 터미널에 도달하지 않을 때 비활성화하는 이유입니다.
GNU의 경우 grep
이미 발견했듯이 해당 동작을 얻으려면 --color=auto
(또는 )이 필요합니다.grep --color
이제 색상을 계속 보려면 파이프라인의 마지막 명령, 즉 터미널에 출력되는 명령으로 색상을 이동해야 합니다.
<file tr '[:lower:]' '[:upper:]' | grep -xE --colour=auto '.{5}'
--colour=auto
명령이 포함된 스크립트가 출력을 리디렉션/사후 처리하는 경우 색상 지정이 비활성화되도록 여기에서 사용됩니다 .
여기서 정규식은 전체 줄( 위의 옵션, 메서드에서 and like를 -x
사용하지 않아도 됨 )과 일치하므로 이전에 전경색을 빨간색으로 전환하고 이후에 속성을 지울 수도 있습니다.^
$
if [ -t 1 ]; then
tput setaf 1 # set ANSI foreground colour
tput bold
fi
grep...
if [ -t 1 ]; then
tput sgr0 # turn off all attributes
fi
이는 터미널의 올바른 시퀀스를 tput
쿼리 하는 데 사용되지만 대부분의 터미널이 이를 수행하므로 다음과 같이 수행하고 시퀀스를 하드코딩합니다.terminfo
grep
[ -t 1 ] && printf '\33[1;31m'
grep...
[ -t 1 ] && printf '\e[m'
[ -t 1 ]
stdout(파일 설명자 1)이 터미널인지 확인 하는 데 사용됩니다 .
답변2
GREP_OPTIONS
로 바꿔서
--color=always
해결했어요--color=auto
tr과 색으로 구분된 텍스트가 잘 어울리지 않는 것 같아요