Tôi sử dụng (GNU) fmt
để định dạng văn bản dài hơn với ngắt dòng tốt (‘tối ưu’). Tuy nhiên, nếu văn bản chứa bất kỳ chuỗi thoát màu ANSI nào (không bao giờ được hiển thị và chỉ phân phát màu văn bản khi hiển thị văn bản), fmt
coi đây là ký tự bình thường và tính toán độ dài dòng sai.Cách ẩn mã thoát màu ANSI từ fmt
Tôi không chắc chắn các ký tự thoát chữ giỏi hoạt động như thế nào ở đây, vì vậy đây là ví dụ đơn giản sử dụng grep
để tạo chuỗi ANSI. Hãy bắt đầu bằng một chuỗi dài để định dạng.
string="Here’s an example of a rather long \
string with quite a few words in the middle \
that grep chooses to colour red."
Nếu chúng ta không làm nổi bật grep
trận đấu, mọi thứ hoạt động tốt:
echo $string | grep --color=no i | fmt -w 50
Nhưng nếu chúng ta làm nổi bật/màu họ, fmt
xem xét các dòng có chứa chữ 'i' là lâu hơn nữa so với thực tế, và chúng được hiển thị dưới dạng các đường thẳng ngắn khi được hiển thị trong thiết bị đầu cuối.
echo $string | grep --color=yes i | fmt -w 50
Có cách nào để tránh điều này không? Đối với ví dụ này, tất nhiên tôi có thể sử dụng fmt
trướcgrep
, nhưng khi chuỗi tìm kiếm mở rộng một vài từ, điều này không hiệu quả.
Cảm ơn. Đó là giải pháp mà tôi đã sử dụng. Việc sử dụng thực tế của tôi trong thực tế này liên quan đến 'sed' thay vì 'grep'. Về cơ bản, tôi chuyển đổi các thẻ (như '|' trong 'đây là một | ví dụ | chuỗi') thành chuỗi màu ANSI để tô màu các từ mà chúng kéo dài. Sử dụng 'fmt' trước khi thay thế không phải là tối ưu, vì các thẻ chiếm một số không gian, ảnh hưởng đến việc gói từ, nhưng nó không quá tệ trừ khi một dòng chứa rất nhiều thẻ như vậy, và tốt hơn là chạy' fmt' sau thay thế (vì các chuỗi thoát ANSI chiếm nhiều ký tự hơn). –