2009-07-12 36 views
5

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 fmttrướ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ả.

Trả lời

5

Dường như không có cách nào tốt để giải quyết vấn đề đó bằng grep và fmt. Tôi khuyên bạn nên chạy fmt trước và sau đó sử dụng sed thay vì grep để tìm kiếm. Ví dụ:

echo The search string will be highlighted red. | fmt -w 50 | sed ":a;$!N;$!ba;s/search[ \n]string/\x1b\[1;31m&\x1b\[0m/g"
+0

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). –

0

Sử dụng `grep --colour = auto 'thay thế sẽ giải quyết được sự cố.

+0

Không, nó sẽ không. Sử dụng 'grep --colour = auto' có cùng kết quả khi sử dụng' grep --colour = no' trong ví dụ này. –

Các vấn đề liên quan