Các ký tự ^[[37mvà ^[[0mlà một phần của chuỗi thoát ANSI (mã CSI) . Xem thêm các thông số kỹ thuật .
Sử dụng GNU sed
sed 's/\x1b\[[0-9;]*m//g'
\x1b(hoặc \x1B) là ký tự đặc biệt thoát
( sedkhông hỗ trợ thay thế \evà \033)
\[ là nhân vật thứ hai của chuỗi thoát
[0-9;]* là giá trị màu (s) regex
m là nhân vật cuối cùng của chuỗi thoát
Trên macOS, sedlệnh mặc định không hỗ trợ các ký tự đặc biệt \enhư được chỉ ra bởi slm và steamer25 trong các bình luận. Sử dụng thay thế gsedmà bạn có thể cài đặt bằng cách sử dụng brew install gnu-sed.
Ví dụ với dòng lệnh của OP: (OP có nghĩa là Poster gốc)
perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' |
sed 's/\x1b\[[0-9;]*m//g'
Tom Hale đề nghị loại bỏ tất cả các chuỗi thoát khác bằng cách sử dụng [a-zA-Z]thay vì chỉ chữ cái mcụ thể cho chuỗi thoát chế độ đồ họa (màu sắc). Nhưng [a-zA-Z]có thể quá rộng và có thể loại bỏ quá nhiều. Michał Faleński và Miguel Mota đề xuất chỉ loại bỏ một số chuỗi thoát bằng cách sử dụng [mGKH]và [mGKF]tương ứng. Britton Kerin cho biết Kcũng phải được sử dụng ngoài mviệc xóa màu khỏi gcclỗi / cảnh báo (đừng quên chuyển hướng gcc 2>&1 | sed...).
sed 's/\x1b\[[0-9;]*m//g' # Remove color sequences only
sed 's/\x1b\[[0-9;]*[a-zA-Z]//g' # Remove all escape sequences
sed 's/\x1b\[[0-9;]*[mGKH]//g' # Remove color and move sequences
sed 's/\x1b\[[0-9;]*[mGKF]//g' # Remove color and move sequences
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
Sử dụng perl
Phiên bản sedcài đặt trên một số hệ điều hành có thể bị giới hạn (ví dụ: macOS). Lệnh perlnày có ưu điểm là thường dễ cài đặt / cập nhật hơn trên nhiều hệ điều hành. Adam Katz đề nghị sử dụng \e(giống như \x1b) trong PCRE .
Chọn regex của bạn tùy thuộc vào số lượng lệnh bạn muốn lọc:
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
Ví dụ với dòng lệnh của OP:
perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' \
| perl -pe 's/\e\[[0-9;]*m//g'
Sử dụng
Như được chỉ ra bởi nhận xét của Stuart Cardall , seddòng lệnh này được sử dụng bởi dự án Ultimate Nginx Bad Bot (1000 sao) để làm sạch báo cáo email ;-)
morehoặcless -Rcó thể hiểu mã thoát là màu thay vì trình soạn thảo văn bản.