Chương trình chuyển STDIN sang STDOUT với mã màu bị tước?


64

Tôi có một lệnh tạo đầu ra có màu và tôi muốn chuyển nó thành một tệp có mã màu được loại bỏ. Có một lệnh hoạt động như catngoại trừ việc nó tước mã màu? Tôi dự định làm một cái gì đó như thế này:

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

4
Nó có thể là một lỗi mà một chương trình tạo ra đầu ra màu ngay cả khi đó đầu ra của nó được chuyển hướng đến một tệp không cung cấp tùy chọn để tắt nó. Tôi mong đợi bất kỳ chương trình nào có màu sắc đầu ra để kiểm tra isatty(stdin)trước khi thực hiện. Tâm trí để chia sẻ chương trình đó là gì?
alex

vượt qua nó cat- kiểm tra nhanh Tôi chạy grep --color=auto myusername /etc/passwdcho tôi tên người dùng màu đỏ với văn bản màu trắng khác. grep --color=auto myusername /etc/passwd | catcung cấp cho tôi văn bản màu trắng đơn giản
ivanivan

1
Đó không phải là một giải pháp. Nó chỉ hoạt động vì grep --color=autotránh tạo ra đầu ra màu khi đầu ra tiêu chuẩn không phải là một thiết bị đầu cuối. Tôi đang nói về một lệnh xuất vô điều kiện mã màu. (Như alex chỉ ra ở trên, hành vi như vậy được cho là một lỗi, nhưng đôi khi chúng ta cần phải làm việc với các phần mềm không hoàn hảo mà chúng ta không thể dễ dàng sửa chữa chính mình, và đó là những gì câu hỏi này là về.)
Ryan Thompson

Câu trả lời:


59

Bạn sẽ nghĩ rằng có một tiện ích cho việc đó, nhưng tôi không thể tìm thấy nó. Tuy nhiên, Perl one-liner này nên thực hiện thủ thuật:

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

Thí dụ:

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

Hoặc, nếu bạn muốn một tập lệnh, bạn có thể lưu dưới dạng stripcolorcodes:

#! /usr/bin/perl

use strict;
use warnings;

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

Nếu bạn muốn dải chỉ mã màu sắc, và để lại bất kỳ mã ANSI khác (như di chuyển con trỏ) một mình, sử dụng

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

thay vì thay thế tôi đã sử dụng ở trên (loại bỏ tất cả các mã thoát ANSI).


9
Như đã đề cập trong một bình luận cho một câu trả lời khác ( unix.stackexchange.com/questions/4527/iêu ), regex này đã được lấy từ Term::ANSIColor. Công nhận nguồn của bạn, xin vui lòng!
tạm biệt

2
thừa nhận nguồn của bạn!
Jürgen Paul

29

Xóa mã màu (ký tự đặc biệt) bằng GNU sed

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

Hoặc là

Dải trình tự thoát ANSI trong Python

Cài đặt gói python colorama ( pip install colorama). Đặt vào stripcolorcodes:

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

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

Chạy đi chmod +x stripcolorcodes.


Điều này thật tuyệt. Chính xác những gì tôi cần!
adivis12

Python hơi chậm nhưng sedrất ấn tượng :)

2
Không thử python, nhưng phiên bản sed không lột hết màu. (Tôi đã không kiểm tra toàn diện, nhưng nó vẫn giữ nguyên một số màu nền, vì vậy tôi đã sử dụng tùy chọn perl nhanh hơn.)
rsaw

22

Nếu bạn có thể cài đặt mô đun Term :: ANSIColor , tập lệnh perl này hoạt động:

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

5
Đó thực sự là nơi tôi có regex chỉ có mã màu. Nhưng cài đặt toàn bộ một mô-đun chỉ cho một regex đó là một chút.
cjm

4
Meh, nếu bạn thiết lập cpanm chính xác, nó sẽ cài đặt mô-đun trong khoảng 5 giây.
Ryan Thompson

Không cần phải viết kịch bản vào tập tin. Chỉ cần vào:perl -mTerm::ANSIColor=colorstrip -n -e 'print colorstrip $_'
Jesse Glick

10

Nếu hệ thống của bạn có quyền truy cập vào NodeJS, bạn có thể cài đặt gói Node sau , strip-ansi-cli.

$ npm install -g strip-ansi-cli

Sau đó, bạn có thể chạy lệnh của mình như vậy:

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

1
NodeJS là một sự phụ thuộc rất lớn, khi có những giải pháp có thể sử dụng ngôn ngữ và công cụ đã có trong hầu hết các hệ thống.
dùng137369

Ngoài ra, đây là giải pháp chậm nhất được liệt kê (xem tại đây ) và bạn có thể sẽ nhận thấy sự khác biệt.

3

Lệnh sed này đã làm điều đó cho tôi:

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

Thí dụ:

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

Điều này dường như không hoạt động với phiên bản mới nhất của sed.

3

Bạn có thể sử dụng ac cho việc này. Nó nên nhanh hơn bất cứ thứ gì được liệt kê ở trên (mặc dù perlsednên được phong nha). Đây là một ví dụ:

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

Như một từ chối trách nhiệm: chức năng lọc màu được viết bởi tôi.


3
một liên kết đến 'ac' sẽ hữu ích. ;)
Vitaly Kushner

Các acchương trình có vẻ là ở đây: hub.darcs.net/vmchale/fastcat
Michael Burr

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

... và nếu cần, (dnf, ...) install ansifilter

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.