Hiển thị tập tin với màu ANSI


12

Tôi có một tập tin với màu ANSI.

test.txt:
\e[0;31mExample\e[0m

Tôi muốn hiển thị nội dung của tệp này trong một thiết bị đầu cuối, giống như catvậy, nhưng tôi cũng muốn hiển thị màu sắc.


4
Sử dụng less -R, ví dụ.
Thomas Dickey

catBản in của bạn là gì?
techraf

1
Câu hỏi của OP có quá nhiều câu trả lời có thể thú vị. Bắt đầu với echo -e $(cat test.txt).
Thomas Dickey

Câu trả lời:


10

Tôi đang tìm kiếm một giải pháp cho câu hỏi bash chính xác này. Tôi gần như bỏ lỡ bình luận của @Thomas Dickey, nơi cung cấp cho tôi giải pháp thanh lịch nhất.

echo -e $(cat test.txt)

Một số điều không hiệu quả với tôi là (rõ ràng bạn không thể lặp lại những điều đó)

cat test.txt | echo -e

hoặc là

less -R test.txt

Một vấn đề khác mà tôi gặp phải là echo -e đã không in các dòng mới và các khoảng trắng liền kề trong tệp một cách độc đáo. Để in chúng, tôi đã sử dụng như sau.

echo -ne $(cat test.txt | sed  's/$/\\n/' | sed 's/ /\\a /g')

Điều này hoạt động cho một tệp test.txt có chứa

\e[0;31mExa         mple\e[0m
\e[0;31mExample line2\e[0m

Câu trả lời tốt, nhưng \arung chuông cho tôi. Tôi đã thay đổi lệnh sed thứ hai của bạn sed 's/ /\\033\\a /g'mà không rung chuông.
diều hâu

1
Sau khi thử nghiệm thêm và tìm thấy nhiều sự không nhất quán trong các chương trình thiết bị đầu cuối khác nhau (iTerm, Atom / nuclide), tôi thấy tốt nhất là chỉ cần $(cat file.txt)trích dẫn hai dấu ngoặc kép và thêm một dòng mới vào cuối - không cần sed - vì vậy: echo -ne "$(<file.txt)" \\nhoặc echo -ne "$(cat <<"EOF" . . . EOF)" \\n. Điều đó cũng ngăn bash thực hiện mở rộng toàn cầu trong văn bản.
diều hâu

1

Nếu bạn không nhìn thấy màu sắc từ catcác ký tự điều khiển có lẽ không còn nguyên vẹn.

Một số công cụ loại bỏ các ký tự điều khiển nhưng để lại ở phần đuôi.

Đối chiếu:

 echo -e "\e[0;31mExample\e[0m foo"

đến

 echo -e "[0;31mExample[0m foo" 

Bạn có thể có thể xây dựng lại chuỗi điều khiển từ những gì còn lại, mặc dù đó không phải là bằng chứng ngu ngốc vì regex bạn sử dụng có thể vô tình kéo theo các chuỗi ký tự ngoài ý muốn, v.v. Nhưng ví dụ:

echo -e "[0;31mExample[0m foo" | sed "s:\[\([0-9]*[;m]\):^[[\1:g"

sẽ khôi phục màu cho chuỗi ví dụ.


-1

Nó nên hoạt động theo mặc định. Ví dụ, nếu tôi làm ls --color=always > /tmp/avà hơn cat /tmp/a, tôi thấy màu sắc. Kiểm tra với odxác nhận rằng tập tin sử dụng màu ANSI.

Vì vậy, tôi nghĩ rằng bạn nên kiểm tra xem thiết bị đầu cuối của bạn có hỗ trợ màu ANSI không (và chúng có được bật không).


1
Điều này đã không trả lời câu hỏi.
Thomas Dickey

1
Không ít -R thực sự giải quyết vấn đề cho tôi.
Ken Ingram
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.