ฉันมีไฟล์ที่มีสี ANSI
test.txt:
\e[0;31mExample\e[0m
ฉันต้องการแสดงเนื้อหาของไฟล์นี้ในเทอร์มินัลเหมือนcat
กัน แต่ต้องการแสดงสีด้วย
cat
งานพิมพ์ของคุณคืออะไร
echo -e $(cat test.txt)
เริ่มต้นด้วย
ฉันมีไฟล์ที่มีสี ANSI
test.txt:
\e[0;31mExample\e[0m
ฉันต้องการแสดงเนื้อหาของไฟล์นี้ในเทอร์มินัลเหมือนcat
กัน แต่ต้องการแสดงสีด้วย
cat
งานพิมพ์ของคุณคืออะไร
echo -e $(cat test.txt)
เริ่มต้นด้วย
คำตอบ:
ฉันกำลังมองหาวิธีการแก้ปัญหาทุบตีนี้แน่นอน ฉันเกือบพลาดความเห็นของ @Thomas Dickey ซึ่งทำให้ฉันมีทางออกที่ดีที่สุด
echo -e $(cat test.txt)
บางสิ่งที่ไม่ได้ผลสำหรับฉันคือ (เห็นได้ชัดว่าคุณไม่สามารถสะท้อนสิ่งต่าง ๆ ได้)
cat test.txt | echo -e
หรือ
less -R test.txt
อีกประเด็นที่ฉันมีคือเสียงก้อง -e ไม่ได้พิมพ์บรรทัดใหม่และช่องว่างที่ต่อเนื่องกันภายในไฟล์อย่างสวยงาม ในการพิมพ์เหล่านั้นฉันใช้สิ่งต่อไปนี้
echo -ne $(cat test.txt | sed 's/$/\\n/' | sed 's/ /\\a /g')
สิ่งนี้ใช้ได้กับไฟล์ test.txt ที่มี
\e[0;31mExa mple\e[0m
\e[0;31mExample line2\e[0m
\a
กดกริ่งสำหรับฉัน ฉันเปลี่ยนคำสั่ง sed ครั้งที่สองของคุณsed 's/ /\\033\\a /g'
ซึ่งไม่ส่งเสียงกริ่ง
$(cat file.txt)
ในราคาคู่และเพิ่มขึ้นบรรทัดใหม่ในตอนท้าย - ไม่จำเป็นสำหรับ sed - ดังนั้น: หรือecho -ne "$(<file.txt)" \\n
echo -ne "$(cat <<"EOF" . . . EOF)" \\n
นอกจากนี้ยังป้องกันไม่ให้ทุบตีทำการขยายแบบกลมในข้อความ
หากคุณไม่เห็นสีจากcat
ตัวควบคุมอาจไม่เป็นอันตราย
เครื่องมือบางตัวดึงเอาอักขระควบคุมออกมา แต่ทิ้งไว้ที่ปลายหาง
เปรียบเทียบ:
echo -e "\e[0;31mExample\e[0m foo"
ถึง
echo -e "[0;31mExample[0m foo"
คุณอาจจะสามารถสร้างลำดับการควบคุมจากสิ่งที่เหลืออยู่ได้ แต่มันไม่ได้เป็นข้อพิสูจน์ที่ผิดเพราะ regex ที่คุณใช้อาจดึงลำดับของอักขระที่ไม่ได้ตั้งใจ ฯลฯ แต่ตัวอย่างเช่น:
echo -e "[0;31mExample[0m foo" | sed "s:\[\([0-9]*[;m]\):^[[\1:g"
จะคืนค่าสีเป็นสตริงตัวอย่าง
มันควรจะทำงานตามค่าเริ่มต้น เช่นถ้าฉันทำls --color=always > /tmp/a
และกว่าcat /tmp/a
ฉันเห็นสี การตรวจสอบด้วยการod
ยืนยันว่าไฟล์ใช้สี ANSI
ดังนั้นฉันคิดว่าคุณควรตรวจสอบว่าเทอร์มินัลของคุณรองรับสี ANSI (และเปิดใช้งาน)
less -R
ตัวอย่างเช่น