Menggunakan sed untuk mewarnai output dari perintah pada solaris

29

Saya memiliki skrip ksh yang harus bekerja pada linux dan solaris. Saya mencoba untuk mewarnai keluaran dari perintah tertentu. Ini bekerja di linux (khususnya RHEL6), tetapi tidak pada solaris (SunOS 5.10).

Perintah di linux (output "test" benar-benar berwarna merah):

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

Command on solaris (output "test" tidak berwarna):

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

Apakah ada cara untuk membuat perintah ini sehingga outputnya merah, tanpa kode mentah di output? Saya tidak dapat mengubah perintah 'echo' karena itu hanya isian untuk perintah yang sebenarnya saya jalankan.

acm
sumber

Jawaban:

35

\xNN adalah urutan pelarian dalam sed GNU, tetapi tidak standar, dan khususnya tidak tersedia pada Solaris.

Anda dapat menyertakan karakter pelarian literal dalam skrip Anda, tetapi itu akan membuatnya sulit untuk dibaca dan diedit.

Anda dapat menggunakan printfuntuk menghasilkan karakter pelarian. Ia memahami pelepasan oktal, bukan heksadesimal.

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

Anda dapat menelepon tputuntuk membuat teks pengganti dalam panggilan ke sed. Perintah ini mencari urutan pelarian dalam basis data terminfo . Secara teori, menggunakan tputmembuat skrip Anda lebih portabel, tetapi dalam praktiknya Anda tidak mungkin menemukan terminal yang tidak menggunakan kode pelarian ANSI .

echo "test" | sed "s,.*,$(tput setaf 1)&$(tput sgr0),"
Gilles 'SANGAT berhenti menjadi jahat'
sumber
ini bekerja sangat baik untuk mewarnai pada cat |sedterlalu thx!
Aquarius Power
8

Akan lebih mudah digunakan tput

tput setaf 1; somecommand; tput sgr0

atau

tput setaf 1
somecommand
tput sgr0

Ini menetapkan foreground menjadi merah, menjalankan somecommandyang kemudian akan menampilkan output dalam warna merah kemudian membersihkan urutan warna. Setidaknya ini berfungsi dengan bash, zshdan ksh.

Lihat tmux(1)dan terminfo(5)untuk informasi lebih lanjut tentang apa yang dapat Anda lakukan tput.

bahamat
sumber
terima kasih atas tanggapannya. Seperti yang saya katakan sebelumnya, saya tidak dapat mengubah perintah echo. 'echo' hanyalah penghalang bagi proses yang saya panggil, yang tidak bisa saya ubah. Apakah mungkin menggunakan sed dengan tput entah bagaimana? Juga, ketika saya menjalankan perintah itu pada sunOS 5.10 saya tidak melihat warna.
acm
Saya memperbaruinya untuk memecahnya menjadi perintah terpisah.
bahamat
Ini lebih baik daripada implementasi saya saat ini karena tidak mencetak kode ascii mentah pada solaris. Namun (untuk alasan apa pun), itu tidak mewarnai keluaran 'somecommand' pada solaris. Itu di linux. Saya telah menerima jawaban @Gilles, yang keduanya berfungsi baik. Terima kasih.
acm
0

Beberapa terminal (seperti bash di iterm untuk saya) memungkinkan Anda untuk menekan tombol "ctrl-v" diikuti oleh "ctrl + [" dan itu akan menempatkan karakter escape literal ke dalam string input. Jika berhasil, Anda mungkin akan melihat karakter "^ [" dicetak di layar, tetapi jika Anda memindahkan kursor di sekitarnya, itu akan memperlakukannya sebagai satu karakter karena itu benar-benar di belakang layar.

Untuk memahami apa yang terjadi (dan untuk menguji apakah ini mungkin), Anda dapat mengetikkan ctrl + v diikuti oleh ctrl + i. Anda akan melihat bahwa karakter tab telah dimasukkan ke string prompt Anda. Ada riwayat CS untuk alasan ini: tetapi ternyata keyboard yang sangat lama memiliki ctrl + I hard wired untuk mengirim karakter tab; dan tombol tab mengirim sinyal listrik yang sama juga.

Untuk alasan warisan itu, bash untuk banyak terminal masih menginterpretasikan kode ctrl tertentu untuk memetakan ke karakter yang sama.

Ctrl + I memetakan ke karakter tab, dan ctrl + [terjadi untuk mencocokkan dengan karakter melarikan diri ascii.

Alexander Bird
sumber