색상 코드가 제거 된 상태에서 STDIN을 STDOUT으로 전달하는 프로그램?


64

색상으로 출력을 생성하는 명령이 있으며 색상 코드를 제거하여 파일로 파이프하고 싶습니다. cat색상 코드를 제거한다는 점을 제외하고 작동하는 명령이 있습니까? 나는 이런 식으로 할 계획이다 :

$ command-that-produces-colored-output | stripcolorcodes > outfile

4
이 프로그램은 출력을 파일로 리디렉션에도 다음 색 출력을 생성 버그 수 있습니다 그것을 떨어져 전환 할 수있는 옵션을 제공하지 않습니다. 출력하기 isatty(stdin)전에 색상을 지정하는 프로그램이 확인 하기 를 기대합니다 . 그 프로그램이 무엇인지 공유 하시겠습니까?
alex

그것을 통과 cat-빠른 테스트를 실행 grep --color=auto myusername /etc/passwd하면 나에게 흰색 텍스트와 함께 빨간색으로 내 사용자 이름을 제공합니다. grep --color=auto myusername /etc/passwd | cat나에게 일반 흰색 텍스트 제공
ivanivan

1
그것은 해결책이 아닙니다. grep --color=auto표준 출력이 터미널이 아닌 경우 컬러 출력을 생성하지 않기 때문에 작동합니다 . 무조건 컬러 코드를 출력하는 명령에 대해 이야기하고 있습니다. (알렉스가 위에서 지적했듯이, 그러한 행동은 아마도 버그이지만, 때로는 스스로를 고칠 수없는 불완전한 소프트웨어로 작업해야 할 때가 있습니다.
Ryan Thompson

답변:


59

이를위한 유틸리티가 있다고 생각하지만 찾을 수 없었습니다. 그러나이 Perl 원 라이너는 트릭을 수행해야합니다.

perl -pe 's/\e\[?.*?[\@-~]//g'

예:

$ command-that-produces-colored-output | perl -pe 's/\e\[?.*?[\@-~]//g' > outfile

또는 스크립트를 원하면 다음과 같이 저장할 수 있습니다 stripcolorcodes.

#! /usr/bin/perl

use strict;
use warnings;

while (<>) {
  s/\e\[?.*?[\@-~]//g; # Strip ANSI escape codes
  print;
}

색상 코드 제거 하고 다른 ANSI 코드 (커서 이동과 같은)는 그대로 두려면

s/\e\[[\d;]*m//g;

위에서 사용한 대체 대신 모든 ANSI 이스케이프 코드를 제거합니다.


9
다른 답변 ( unix.stackexchange.com/questions/4527/… ) 에 대한 주석에서 언급 했듯이이 정규식은에서 가져 왔습니다 Term::ANSIColor. 당신의 출처를 인정하십시오!
forivall

2
출처를 인정하십시오!
Jürgen Paul

29

GNU sed로 색상 코드 (특수 문자) 제거

sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"

또는

파이썬에서 ANSI 이스케이프 시퀀스 제거

colorama python 패키지 ( pip install colorama)를 설치 하십시오 . 넣다 stripcolorcodes:

#!/usr/bin/env python
import colorama, fileinput, sys;
colorama.init(strip=True);

for line in fileinput.input():
    sys.stdout.write(line)

를 실행하십시오 chmod +x stripcolorcodes.


대단해. 정확히 내가 필요한 것!
adivis12

파이썬은 조금 느리지 만 sed인상적입니다 :)

2
파이썬을 시도하지 않았지만 sed 버전이 모든 색상을 제거하지는 않습니다. (완전히 테스트하지는 않았지만 배경색이 그대로 유지되었으므로 더 빠른 펄 옵션을 사용했습니다.)
rsaw

22

Term :: ANSIColor 모듈을 설치할 수 있으면 이 perl 스크립트가 작동합니다.

#!/usr/bin/env perl
use Term::ANSIColor qw(colorstrip);
print colorstrip $_ while <>;

5
그것이 실제로 색상 코드 전용 정규 표현식을 얻은 곳입니다. 그러나 하나의 정규 표현식에 대해서만 전체 모듈을 설치하는 것은 약간 많습니다.
CJM

4
Meh, cpanm을 올바르게 설정하면 약 5 초 후에 모듈이 설치됩니다.
Ryan Thompson

스크립트를 파일에 쓸 필요가 없습니다. 다음으로 연결하십시오 :perl -mTerm::ANSIColor=colorstrip -n -e 'print colorstrip $_'
Jesse Glick

10

시스템이 NodeJS에 액세스 할 수있는 경우 다음 노드 패키지를 설치할 수 strip-ansi-cli있습니다.

$ npm install -g strip-ansi-cli

그런 다음 명령을 다음과 같이 실행할 수 있습니다.

$ command-that-produces-colored-output | strip-ansi > outfile

1
NodeJS는 대부분의 시스템에 이미 존재하는 언어와 도구를 사용할 수있는 솔루션이있을 때 큰 의존성입니다.
user137369

또한,이 나열된 느린 솔루션이다 ( 여기에 ) 당신은 아마 의 차이를 알 수 있습니다.

3

이 sed 명령은 나를 위해 그것을했습니다 :

sed -r "s/\\^\\[(\\[[^@-~]+[@-~]|[0-9@-_]|%@)//g"

예:

$ command-that-produces-colored-output | sed -r "s/\\^\\[(\\[[^@-~]+[@-~]|[0-9@-_]|%@)//g" > outfile

최신 버전의에서는 작동하지 않는 것 같습니다 sed.

3

이를 위해 ac 를 사용할 수 있습니다 . 그것은 위에 나열된 어떤 것보다 더 빨리해야한다 (그러나 perlsed괜찮은해야한다). 예를 들면 다음과 같습니다.

curl -s wttr.in/LA | ac -s

면책 조항 : 컬러 필터링 기능은 저에 의해 작성되었습니다.


3
'ac'에 대한 링크가 도움이 될 것입니다. ;)
Vitaly Kushner

ac프로그램은 여기에있을 것 같다 : hub.darcs.net/vmchale/fastcat
마이클 버

1
$ command-that-produces-colored-output | ansifilter

... 필요하다면 (dnf, ...) install ansifilter

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.