Sử dụng sed để tô màu đầu ra từ một lệnh trên solaris


29

Tôi có một kịch bản ksh phải hoạt động trên cả linux và solaris. Tôi đang cố gắng tô màu đầu ra của các lệnh cụ thể. Nó hoạt động trên linux (cụ thể là RHEL6), nhưng không hoạt động trên solaris (SunOS 5.10).

Lệnh trên linux ("kiểm tra" đầu ra có màu đỏ chính xác):

[amartin@linuxbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,'
test

Lệnh trên solaris ("kiểm tra" đầu ra không có màu):

[amartin@sunbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,'
x1B[31mtestx1B[0m

Có cách nào để tạo lệnh này sao cho đầu ra có màu đỏ, không có mã thô trong đầu ra không? Tôi không thể thay đổi lệnh 'echo' vì đó chỉ là phần bổ sung cho lệnh tôi thực sự đang chạy.

Câu trả lời:


35

\xNN là một chuỗi thoát trong GNU sed, nhưng nó không phải là tiêu chuẩn và đặc biệt là nó không có sẵn trên Solaris.

Bạn có thể bao gồm một ký tự thoát theo nghĩa đen trong kịch bản của mình, nhưng điều đó sẽ khiến bạn khó đọc và chỉnh sửa.

Bạn có thể sử dụng printfđể tạo ra một nhân vật thoát. Nó hiểu thoát bát phân, không phải thập lục phân.

esc=$(printf '\033')
echo "test" | sed "s,.*,${esc}[31m&${esc}[0m,"

Bạn có thể gọi tputđể tạo văn bản thay thế trong cuộc gọi đến sed. Lệnh này tìm kiếm các chuỗi thoát trong cơ sở dữ liệu terminfo . Về lý thuyết, việc sử dụng tputlàm cho tập lệnh của bạn dễ di chuyển hơn, nhưng trong thực tế, bạn không thể gặp phải một thiết bị đầu cuối không sử dụng mã thoát ANSI .

echo "test" | sed "s,.*,$(tput setaf 1)&$(tput sgr0),"

Điều này hoạt động tuyệt vời để tô màu trên một cat |sedthx quá!
Sức mạnh Bảo Bình

8

Nó sẽ dễ sử dụng hơn tput

tput setaf 1; somecommand; tput sgr0

hoặc là

tput setaf 1
somecommand
tput sgr0

Điều này đặt tiền cảnh thành màu đỏ, chạy somecommandsau đó sẽ hiển thị đầu ra màu đỏ sau đó xóa chuỗi màu. Điều này hoạt động ít nhất với bash, zshksh.

Xem tmux(1)terminfo(5)để biết thêm thông tin về những gì bạn có thể làm với tput.


Cảm ơn vì sự trả lời. Như tôi đã nói trước đó, tôi không thể thay đổi lệnh echo. 'echo' chỉ là phần thay thế cho quá trình tôi đang gọi mà tôi không thể thay đổi. Có thể sử dụng sed với tput bằng cách nào đó? Ngoài ra, khi tôi chạy lệnh đó trên sunOS 5.10, tôi không thấy bất kỳ màu nào.
acm

Tôi cập nhật nó để tách nó thành các lệnh riêng biệt.
bahamat

Điều này tốt hơn so với triển khai hiện tại của tôi ở chỗ nó không in mã ascii thô trên solaris. Tuy nhiên (vì bất kỳ lý do gì), nó không tô màu đầu ra của 'somecommand' trên solaris. Nó hiện trên linux. Tôi đã chấp nhận câu trả lời @Gilles, trong đó có cả hai. Cảm ơn bạn.
acm

0

Một số thiết bị đầu cuối (như bash in iterm for me) cho phép bạn nhấn các phím "ctrl-v" theo sau là "ctrl + [" và nó sẽ đặt ký tự thoát theo nghĩa đen vào chuỗi đầu vào. Nếu nó hoạt động, có thể bạn sẽ thấy các ký tự "^ [" được in trên màn hình, nhưng nếu bạn di chuyển con trỏ xung quanh nó, nó sẽ coi nó là một ký tự vì nó thực sự ở phía sau hậu trường.

Để hiểu những gì đang xảy ra (và để kiểm tra nếu điều này là có thể), bạn có thể nhập ctrl + v theo sau là ctrl + i. Bạn sẽ thấy rằng ký tự tab đã được chèn vào chuỗi nhắc của bạn. Có CS lịch sử cho lý do tại sao đây là trường hợp: nhưng nó chỉ ra rằng bàn phím thực sự cũ đã ctrl + I cứng có dây để gửi ký tự tab; và phím tab cũng gửi tín hiệu điện tương tự.

Vì lý do di sản đó, bash cho nhiều thiết bị đầu cuối vẫn diễn giải các mã ctrl nhất định để ánh xạ tới các ký tự đó.

Ctrl + I ánh xạ tới ký tự tab và ctrl + [xảy ra khớp với ký tự thoát ascii.

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.