Các ký tự ^[[37m
và ^[[0m
là 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
( sed
không hỗ trợ thay thế \e
và \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, sed
lệnh mặc định không hỗ trợ các ký tự đặc biệt \e
như được chỉ ra bởi slm và steamer25 trong các bình luận. Sử dụng thay thế gsed
mà 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 m
cụ 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 K
cũng phải được sử dụng ngoài m
việc xóa màu khỏi gcc
lỗ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 sed
cài đặt trên một số hệ điều hành có thể bị giới hạn (ví dụ: macOS). Lệnh perl
nà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 , sed
dò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 ;-)
more
hoặcless -R
có thể hiểu mã thoát là màu thay vì trình soạn thảo văn bản.