스크립트 출력에서 ​​제어 문자(콘솔 코드/색상 포함) 제거

스크립트 출력에서 ​​제어 문자(콘솔 코드/색상 포함) 제거

"script" 명령을 사용하여 명령줄에서 대화형 세션을 기록할 수 있습니다. 그러나 여기에는 모든 제어 문자가 포함됩니다.그리고색상 코드. "col -b"를 사용하여 제어 문자(예: 백스페이스)를 제거할 수 있지만 색상 코드를 제거하는 쉬운 방법을 찾을 수 없습니다.

명령줄을 일반적인 방법으로 사용하고 싶기 때문에 색상을 비활성화하고 싶지는 않습니다. 단지 스크립트 출력에서 ​​색상을 제거하고 싶습니다. 또한 문제를 해결하는 정규식을 찾는 것이 가능하다는 것을 알고 있지만 더 간단하고 더 안정적인 솔루션을 원합니다. 정규식을 개발할 때 내가 모르는 코드가 있으면 어떻게 됩니까?

디스플레이 문제:

spl62 tmp:스크립트
스크립트가 시작되고 파일이 TypeScript입니다.
spl62 lepl: ls
add-licence.sed build-example.sh 테스트 제출 Push-docs.sh
추가-licence.sh build.sh 삭제-licence.sed setup.py
asn 빌드-테스트.sh 삭제-licence.sh src
build-doc.sh는 doc-src test.ini를 정리합니다.
spl62 lepl:종료
스크립트가 완료되었으며 파일은 TypeScript입니다.
spl62 tmp: cat -v 타이프스크립트
스크립트는 2011년 6월 9일 목요일 오전 9시 47분 27초 CLT에 시작되었습니다.
spl62 lepl: ls^M
^[[0m^[[00madd-licence.sed^[[0m ^[[00;32mbuild-example.sh^[[0m ^[[00mcommit-test^[[0m ^[[00;32mpush-docs.sh) ] ^[[0m^m
^[[00;32madd-licence.sh^[[0m ^[[00;32mbuild.sh^[[0m ^[[00mdelete-licence.sed^[[0m ^[[00msetup.py^[[0m^M) ]
^[[01;34masn^[[0m ^[[00;32mbuild-test.sh^[[0m ^[[00;32mdelete-licence.sh^[[0m ^[[01;34msrc^[[0m^M) ]
^[[00;32mbuild-doc.sh^[[0m ^[[00;32mclean^[[0m ^[[01;34mdoc-src^[[0m ^[[00mtest.ini^[[0m^M]
spl62 lepl: 종료^M

스크립트는 2011년 6월 9일 목요일 오전 9시 47분 29초 CLT에 완료되었습니다.
spl62 tmp: col -b < 타이프스크립트
스크립트는 2011년 6월 9일 목요일 오전 9시 47분 27초 CLT에 시작되었습니다.
spl62 lepl: ls
0m00madd-licence.sed0m 00;32mbuild-example.sh0m 00mcommit-test0m 00;32mpush-docs.sh0m
00;32madd-licence.sh0m 00;32mbuild.sh0m 00mdelete-licence.sed0m 00msetup.py0m
01;34masn0m 00;32mbuild-test.sh0m 00;32mdelete-licence.sh0m 01;34msrc0m
00;32mbuild-doc.sh0m 00;32mclean0m 01;34mdoc-src0m 00mtest.ini0m
spl62 lepl:종료

스크립트는 2011년 6월 9일 목요일 오전 9시 47분 29초 CLT에 완료되었습니다.

답변1

다음 스크립트는 모든 ANSI/VT100/xterm 제어 시퀀스를 필터링해야 합니다(기준:ctseq). 최소한의 테스트 후 과소 또는 과소 일치하는 항목을 보고해 주세요.

#!/usr/bin/env perl
## uncolor — remove terminal escape sequences such as color changes
while (<>) {
    s/ \e[ #%()*+\-.\/]. |
       \e\[ [ -?]* [@-~] | # CSI ... Cmd
       \e\] .*? (?:\e\\|[\a\x9c]) | # OSC ... (ST|BEL)
       \e[P^_] .*? (?:\e\\|\x9c) | # (DCS|PM|APC) ... ST
       \e. //xg;
    print;
}

알려진 문제:

  • 잘못된 시퀀스에 대해 불평하지 마세요. 이는 이 스크립트의 목적이 아닙니다.
  • DCS/PM/APC/OSC에 대한 여러 줄 문자열 매개변수는 지원되지 않습니다.
  • 128-159 범위의 바이트는 제어 문자로 구문 분석될 수 있지만 거의 사용되지 않습니다. 이는 비ASCII 제어 문자를 구문 분석하는 버전입니다(이로 인해 UTF-8을 포함한 일부 인코딩에서 비ASCII 텍스트가 깨집니다).
#!/usr/bin/env perl
## uncolor — remove terminal escape sequences such as color changes
while (<>) {
    s/ \e[ #%()*+\-.\/]. |
       (?:\e\[|\x9b) [ -?]* [@-~] | # CSI ... Cmd
       (?:\e\]|\x9d) .*? (?:\e\\|[\a\x9c]) | # OSC ... (ST|BEL)
       (?:\e[P^_]|[\x90\x9e\x9f]) .*? (?:\e\\|\x9c) | # (DCS|PM|APC) ... ST
       \e.|[\x80-\x9f] //xg;
    print;
}

답변2

업데이트 중자일스의 대답캐리지 리턴을 제거하고 이전 문자의 백스페이스 삭제를 수행하는 것도 가능합니다. 이 두 가지 모두 Cygwin에서 TypeScript를 생성할 때 중요합니다.

#!/usr/bin/perl

while (<>) {
  s/ \e[ #%()*+\-.\/]. |
    \r | # Remove extra carriage returns also
    (?:\e\[|\x9b) [ -?]* [@-~] | # CSI ... Cmd
    (?:\e\]|\x9d) .*? (?:\e\\|[\a\x9c]) | # OSC ... (ST|BEL)
    (?:\e[P^_]|[\x90\x9e\x9f]) .*? (?:\e\\|\x9c) | # (DCS|PM|APC) ... ST
    \e.|[\x80-\x9f] //xg;
    1 while s/[^\b][\b]//g;  # remove all non-backspace followed by backspace
  print;
}

답변3

하나 있다ansi2txtcolorized-logsUbuntu 패키지의 명령입니다. ANSI 색상 코드를 제거하는 데는 효과적이지만 텍스트를 내보내는 데 의해 생성되는 진행률 표시줄 ^H이나 ^M문자를 오버레이하는 것과 같은 작업은 처리하지 않습니다. col -b다룰수있다그것들이므로 최상의 결과를 얻으려면 두 가지를 결합할 수 있습니다.

cat typescript | ansi2txt | col -b

답변4

cat typescript | perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' | col -b > typescript-processed

관련 정보