텍스트 스트림에서 ANSI 색상 코드 제거

텍스트 스트림에서 ANSI 색상 코드 제거

출력 검토

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'

개량

플래그는 -eGNU의 경우 선택 사항이지만 sedmacOS 기본값의 경우 필수입니다 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(와 동일 ) 을 사용하는 것이 좋습니다.\x1bPCRE.

필터링하려는 명령의 양에 따라 정규식을 선택하십시오.

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진수이므로 정규식에서 \x1Bor 를 사용해야 합니다 .\033

perl -pe 's/\033\[37m//g; s/\033[0m//g'

perl -pe 's/\033\[\d*(;\d*)*m//g'

관련 정보