การใช้ sed เพื่อระบายสีเอาต์พุตจากคำสั่งบน solaris


29

ฉันมีสคริปต์ ksh ที่ต้องทำงานกับทั้ง linux และ solaris ฉันกำลังพยายามระบายสีผลลัพธ์ของคำสั่งเฉพาะ ใช้งานได้กับ linux (โดยเฉพาะ RHEL6) แต่ไม่ใช้กับ Solaris (SunOS 5.10)

คำสั่งบน linux (ผลลัพธ์ "test" เป็นสีแดงที่ถูกต้อง):

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

คำสั่งเกี่ยวกับโซลาริส (ผลลัพธ์ "การทดสอบ" ไม่มีสี)

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

มีวิธีการสร้างคำสั่งนี้ว่าเอาท์พุทเป็นสีแดงโดยไม่ต้องรหัสดิบในการส่งออก? ฉันไม่สามารถเปลี่ยนคำสั่ง 'echo' ได้เพราะนั่นเป็นเพียงการกรอกคำสั่งที่ฉันใช้อยู่

คำตอบ:


35

\xNN เป็นลำดับการหลบหนีใน GNU sed แต่มันไม่ได้เป็นมาตรฐานและโดยเฉพาะอย่างยิ่งมันไม่สามารถใช้ได้กับ Solaris

คุณสามารถใส่อักขระการหลบหนีตามตัวอักษรในสคริปต์ของคุณ แต่นั่นจะทำให้อ่านและแก้ไขได้ยาก

คุณสามารถใช้printfเพื่อสร้างตัวละครหนี มันเข้าใจการหนีฐานแปดไม่ใช่เลขฐานสิบหก

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

คุณสามารถโทรtputเพื่อสร้างข้อความการแทนที่ในการเรียกเพื่อ sed คำสั่งนี้ค้นหา escape sequences ในฐานข้อมูลterminfo ในทางทฤษฎีที่ใช้tputทำสคริปต์ของคุณพกพามากขึ้น แต่ในทางปฏิบัติคุณไม่น่าจะพบสถานีที่ไม่ได้ใช้รหัสหนี ANSI

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

นี้ใช้งานได้ดีในการ colorize บนcat |sedขอบคุณเกินไป!
กุมภ์กุมภ์

8

มันจะใช้งานง่ายขึ้น tput

tput setaf 1; somecommand; tput sgr0

หรือ

tput setaf 1
somecommand
tput sgr0

ชุดนี้ทำงานเบื้องหน้าเป็นสีแดงsomecommandซึ่งจะแสดงผลลัพธ์เป็นสีแดงแล้วล้างลำดับสี นี้ทำงานได้อย่างน้อยbash, และzshksh

ดูtmux(1)และสำหรับข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่คุณสามารถทำได้ด้วยterminfo(5)tput


ขอบคุณสำหรับคำตอบ อย่างที่ฉันพูดไปก่อนหน้านี้ฉันไม่สามารถเปลี่ยนคำสั่ง echo ได้ 'echo' เป็นเพียงสิ่งที่อยู่ในกระบวนการที่ฉันเรียกซึ่งฉันไม่สามารถเปลี่ยนแปลงได้ เป็นไปได้ไหมที่จะใช้ sed กับ tput นอกจากนี้เมื่อฉันเรียกใช้คำสั่งนั้นบน sunOS 5.10 ฉันไม่เห็นสีใด ๆ
acm

ฉันปรับปรุงมันเพื่อแยกมันออกเป็นคำสั่งแยกต่างหาก
bahamat

นี่ดีกว่าการใช้งานปัจจุบันของฉันเพราะมันไม่ได้พิมพ์รหัส ascii ดิบบนโซลาริส อย่างไรก็ตาม (ไม่ว่าด้วยเหตุผลใดก็ตาม) มันไม่ได้ระบายสีเอาท์พุทของ 'somecommand' บนโซลาริส มันทำบน linux ฉันยอมรับคำตอบ @Gilles แล้วซึ่งก็ทำทั้งสองอย่าง ขอขอบคุณ.
ACM

0

เทอร์มินัลบางตัว (เช่นทุบตีใน iterm สำหรับฉัน) อนุญาตให้คุณกดปุ่ม "ctrl-v" ตามด้วย "ctrl + [" และมันจะใส่อักขระหลบหนีตามตัวอักษรลงในสตริงอินพุต หากใช้งานได้คุณอาจเห็นตัวอักษร "^ [" พิมพ์อยู่บนหน้าจอ แต่ถ้าคุณเลื่อนเคอร์เซอร์ไปรอบ ๆ มันจะถือว่ามันเป็นตัวละครตัวหนึ่งเพราะอยู่ด้านหลังของฉาก

เพื่อทำความเข้าใจว่าเกิดอะไรขึ้น (และเพื่อทดสอบว่าเป็นไปได้หรือไม่) คุณสามารถพิมพ์ ctrl + v ตามด้วย ctrl + i คุณควรเห็นว่าอักขระแท็บถูกแทรกลงในสตริงพรอมต์ของคุณ มีประวัติของ CS สำหรับสาเหตุที่เป็นเช่นนี้: แต่ปรากฎว่าแป้นพิมพ์เก่าจริงๆมี ctrl + ฉันสายยากที่จะส่งอักขระแท็บ; และปุ่มแท็บก็ส่งสัญญาณไฟฟ้าเดียวกันด้วย

ด้วยเหตุผลดั้งเดิมนั้นการทุบตีสำหรับเทอร์มินัลจำนวนมากยังคงตีความรหัส ctrl บางอย่างเพื่อจับคู่กับอักขระตัวเดียวกัน

Ctrl + I จับคู่กับอักขระแท็บและ ctrl + [ตรงกับอักขระ ascii escape

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.