2013-08-01 43 views
53

Tôi có một số tập lệnh tạo ra màu sắc và tôi cần loại bỏ điều này.Xóa màu khỏi đầu ra

#!/bin/bash 

exec > >(tee log) # redirect the output to a file but keep it on stdout 
exec 2>&1 

./somescript 

Đầu ra là (trong tập tin log):

java (pid 12321) is [email protected][60G[@[0;32m OK @[0;39m] 

Tôi không biết làm thế nào để đưa các nhân vật ESC đây, vì vậy tôi đặt @ vào chỗ của nó.

Tôi đã thay đổi kịch bản thành:

#!/bin/bash 

exec > >(tee log) # redirect the output to a file but keep it on stdout 
exec 2>&1 

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

Nhưng bây giờ nó mang lại cho tôi (trong tập tin log):

java (pid 12321) is [email protected][60G[ OK ] 

Làm thế nào có thể tôi cũng loại bỏ điều này '@[60G?

Có thể có cách tắt hoàn toàn màu cho toàn bộ tập lệnh?

Trả lời

76

According to Wikipedia, mà biết tất cả mọi thứ, những [m|K] trong sed lệnh bạn đang sử dụng được thiết kế đặc biệt để xử lý m (lệnh màu) và K (các "xóa một phần của dòng" lệnh). Tập lệnh của bạn đang cố gắng đặt vị trí con trỏ tuyệt đối thành 60 (^[[60G) để nhận tất cả các OK trong một dòng, mà dòng sed của bạn không bao gồm.

(đúng, [m|K] nên có lẽ được (m|K) hoặc [mK], bởi vì bạn không cố gắng để phù hợp với một nhân vật ống. Nhưng điều đó không quan trọng ngay bây giờ.)

Nếu bạn chuyển rằng trận đấu cuối cùng trong lệnh của bạn để [mGK] hoặc (m|G|K), bạn sẽ có thể nắm bắt chuỗi điều khiển bổ sung đó.

./somescript | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" 
+12

Người dùng BSD/OSX: Chúng tôi thường không có tùy chọn -r để sed. 'brew install gnu-sed' sẽ cài đặt một phiên bản có khả năng. Chạy với 'gsed'. –

+0

Nếu tôi làm 'echo" $ (tput setaf 1) foo $ (tput sgr0) bar "| sed-r "s/\ x1B \ [([0-9] {1,2} (; [0-9] {1,2})?)? [mGK] // g" | mèo -A', tôi nhận được: 'foo^O bar $' Vì vậy, tôi đoán một số ký tự không được xóa đúng, phải không? Bạn có biết làm thế nào để sửa chữa? – edi9999

+1

@ edi9999 Theo như tôi có thể nói, sự khác biệt có cài đặt màu sắc vượt quá 16 màu (như 'hỗ trợ' setaf') yêu cầu nhiều tham số hơn chỉ hai; regex của tôi hỗ trợ hai. Thay đổi '?' Đầu tiên cho '*' sẽ giúp ích. Xử lý 'sgr0' là có thể nhưng dựa trên một tìm kiếm nó có khả năng phát triển bên ngoài phạm vi của câu trả lời dựa trên regex hacky này. –

10

Hmm, không chắc chắn nếu điều này sẽ làm việc cho bạn, nhưng 'tr' sẽ 'dải' (xóa) mã kiểm soát - thử:

./somescript | tr -d '[:cntrl:]' 
+10

Đột nhiên, nó cũng xóa các dòng mới – ruX

+0

Có, LF và CR (mã) là mã kiểm soát; nếu bạn quan tâm đến nhiều hơn một dòng thì đây có thể không phải là một giải pháp. Vì có vẻ như bạn đang chạy một chương trình JAVA, tôi sẽ đoán rằng các màu sắc được quản lý từ đó; Nếu không, bạn sẽ cần phải nhìn vào thiết lập giao diện điều khiển của bạn (tức là thiết lập thiết bị đầu cuối/bảng màu) và/hoặc tại các tùy chọn cho mỗi lệnh hỗ trợ 'màu sắc', tức là ls --color = không bao giờ –

+0

Tôi thích câu trả lời này cho sự thanh lịch của nó, thậm chí nếu nó làm nhiều hơn là chỉ xóa màu. Cảm ơn! –

5

Tôi cũng đã có vấn đề mà đôi khi , nhân vật SI xuất hiện.

Nó xảy ra ví dụ với đầu vào này: echo "$(tput setaf 1)foo$(tput sgr0) bar"

Đây là một cách cũng tước nhân vật SI (shift in) (0x0F)

./somescript | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" | sed "s/\x0f//g" 
+0

Không chắc chắn tại sao câu trả lời này nhận được rất ít tín dụng. Đây là người duy nhất làm việc cho tôi ... – m8mble

3

@ giải pháp jeff-bowman đã giúp tôi loại bỏ MỘT SỐ mã màu. tôi đã thêm một phần nhỏ để regex để loại bỏ một số chi tiết:

sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" # Original. Removed Red ([31;40m[1m[error][0m) 
sed -r "s/\x1B\[([0-9];)?([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" # With an addition, removed yellow and green ([1;33;40m[1m[warning][0m and [1;32;40m[1m[ok][0m) 
       ^^^^^^^^^ 
       remove Yellow and Green (and maybe more colors) 
-5

này làm việc cho tôi:

./somescript | cat 
+1

Điều đó phụ thuộc vào cách 'somescript' được thực hiện. Nó có thể hoặc không thể nhận ra rằng đầu ra tiêu chuẩn của nó là một tty. (Những người phạm tội từ thực sự mã hóa các mã thoát hiểm cụ thể trong chương trình, và phá vỡ khủng khiếp khi được sử dụng trên các thiết bị đầu cuối khác hoặc trong các kịch bản lệnh). –

+0

Cảm ơn Toby. Tôi đã sử dụng manage.py của django để kiểm tra, nhưng những gì bạn nói có ý nghĩa. – spiderlama

5

tôi không thể có được kết quả khá từ bất kỳ câu trả lời khác, nhưng những điều sau đây đã hiệu quả đối với tôi:

somescript | sed -r "s/[[:cntrl:]]\[[0-9]{1,3}m//g" 

Nếu tôi chỉ xóa phần tử điều khiển "^ [", nó để phần còn lại của dữ liệu màu, ví dụ: "33m". Bao gồm cả mã màu và "m" đã làm các trick. Tôi đang bối rối với s/\ x1B // g không hoạt động vì \ x1B [31m chắc chắn hoạt động với echo.

+1

Trên OSX (BSD sed), sử dụng '-E' thay vì' -r' cho regex mở rộng. Có thể tìm thấy thêm [tại đây] (https://unix.stackexchange.com/a/131940) – Assambar

Các vấn đề liên quan