출력 검토
perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";'
텍스트 편집기(예: vi
)에 다음이 표시됩니다.
^[[37mABC
^[[0m
출력 파일에서 ANSI 색상 코드를 어떻게 제거합니까? 가장 좋은 방법은 일종의 스트림 편집기를 통해 출력을 파이프하는 것입니다.
다음은 작동하지 않습니다
perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' | perl -pe 's/\^\[\[37m//g' | perl -pe 's/\^\[\[0m//g'
답변1
캐릭터 ^[[37m
와 ^[[0m
의 일부입니다.ANSI 이스케이프 시퀀스(CSI 코드). 또한보십시오이 사양.
GNU 사용sed
sed -e 's/\x1b\[[0-9;]*m//g'
\x1b
(또는\x1B
)은탈출하다특수 문자
(GNU는sed
대체 문자를 지원하지 않음\e
및\033
)\[
이스케이프 시퀀스의 두 번째 문자입니다.[0-9;]*
색상 값 정규식입니다.m
이스케이프 시퀀스의 마지막 문자입니다.
macOS 기본값 사용sed
마이크제안:
sed -e $'s/\x1b\[[0-9;]*m//g'
macOS 기본값은 지적한 것과 sed
같은 특수 문자를 지원하지 않습니다.\e
슬름그리고증기선25댓글에.
설치하기 위해서 gsed
.
brew install gnu-sed
OP 명령줄의 예
(OP는 원본 포스터를 의미합니다)
perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' |
sed 's/\x1b\[[0-9;]*m//g'
개량
플래그는 -e
GNU의 경우 선택 사항이지만 sed
macOS 기본값의 경우 필수입니다 sed
.
sed 's/\x1b\[[0-9;]*m//g' # Remove color sequences only
톰 헤일그래픽 모드 이스케이프 시퀀스(색상)와 관련된 [a-zA-Z]
문자 대신 다음을 사용하여 다른 모든 이스케이프 시퀀스도 제거하는 것이 좋습니다 .m
sed 's/\x1b\[[0-9;]*[a-zA-Z]//g' # Remove all escape sequences
하지만 [a-zA-Z]
너무 넓어서 너무 많이 제거될 수 있습니다.미하우 팔렌스키그리고미구엘 모타[mGKH]
각각 및 를 사용하여 일부 이스케이프 시퀀스만 제거할 것을 제안합니다 [mGKF]
.
sed 's/\x1b\[[0-9;]*[mGKH]//g' # Remove color and move sequences
sed 's/\x1b\[[0-9;]*[mGKF]//g' # Remove color and move sequences
sed 's/\x1b\[[0-9;]*[mGKHF]//g' # Remove all
Last escape
sequence
character Purpose
--------- -------------------------------
m Graphics Rendition Mode (including color)
G Horizontal cursor move
K Horizontal deletion
H New cursor position
F Move cursor to previous n lines
브리튼 케린K
는 ( 외에도 ) 오류/경고 m
에서 색상을 제거함을 나타냅니다 . gcc
리디렉션하는 것을 잊지 마십시오 gcc 2>&1 | sed...
.
사용perl
sed
일부 운영 체제에 설치되는 의 버전은 제한될 수 있습니다(예: macOS). 이 명령은 perl
일반적으로 더 많은 운영 체제에서 설치/업데이트가 더 쉽다는 장점이 있습니다.아담 카츠에서 \e
(와 동일 ) 을 사용하는 것이 좋습니다.\x1b
PCRE.
필터링하려는 명령의 양에 따라 정규식을 선택하십시오.
perl -pe 's/\e\[[0-9;]*m//g' # Remove colors only
perl -pe 's/\e\[[0-9;]*[mG]//g'
perl -pe 's/\e\[[0-9;]*[mGKH]//g'
perl -pe 's/\e\[[0-9;]*[a-zA-Z]//g'
perl -pe 's/\e\[[0-9;]*m(?:\e\[K)?//g' # Adam Katz's trick
OP 명령줄의 예:
perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' \
| perl -pe 's/\e\[[0-9;]*m//g'
용법
가 지적한 바와 같이스튜어트 카달님의 의견에 따르면 이 sed
명령줄은 프로젝트에서 사용됩니다.궁극의 Nginx 나쁜 봇(별 1000개) 이메일 보고서를 정리합니다 ;-)
답변2
MacOS를 사용하는 경우 더 나은 이스케이프 시퀀스 제거 프로그램을 찾았습니다. 이것을 확인하세요:
perl -pe 's/\x1b\[[0-9;]*[mG]//g'
답변3
ansi2txt
https://unix.stackexchange.com/a/527259/116915
cat typescript | ansi2txt | col -b
ansi2txt
: ANSI 색상 코드 제거col -b
: 제거^H
또는^M
업데이트: //@DanielF가 언급한 열 핸들 탭 및 공간 정보
〇. col
핸들 공간 및 탭 정보
col -bx
'\t'를 ' '로 바꾸고,
col -bh
' '을 '\t'로 바꿉니다.
// col
공간/탭을 그대로 유지할 수 없는 것 같아 안타깝습니다.
0. 원본 문자열
$ echo -e ' ff\tww' | hd
00000000 20 20 20 20 20 20 20 20 66 66 09 77 77 0a | ff.ww.|
1. -h 공백을 탭으로 바꿉니다.
$ echo -e ' ff\tww' | col -b | hd
00000000 09 66 66 09 77 77 0a |.ff.ww.|
$ echo -e ' ff\tww' | col -bh | hd
00000000 09 66 66 09 77 77 0a |.ff.ww.|
$ echo -e ' ff\tww' | col -bxh | hd
00000000 09 66 66 09 77 77 0a |.ff.ww.|
2. -x 탭을 공백으로 바꿉니다.
$ echo -e ' ff\tww' | col -bx | hd
00000000 20 20 20 20 20 20 20 20 66 66 20 20 20 20 20 20 | ff |
00000010 77 77 0a |ww.|
$ echo -e ' ff\tww' | col -bhx | hd
00000000 20 20 20 20 20 20 20 20 66 66 20 20 20 20 20 20 | ff |
00000010 77 77 0a |ww.|
3. col
공백과 탭을 그대로 유지할 수 없는 것 같습니다.
답변4
^[
그대로 표시되는 것~ 아니다 ^
그리고 [
; 이는 또는 ESC
에 의해 생성된 ASCII 문자입니다 ( 기호는 Ctrl 키를 의미함).EscCtrl[^
ESC
는 0x1B 16진수 또는 033 8진수이므로 정규식에서 \x1B
or 를 사용해야 합니다 .\033
perl -pe 's/\033\[37m//g; s/\033[0m//g'
perl -pe 's/\033\[\d*(;\d*)*m//g'