2009-07-12 2 views
5

Я использую (GNU) fmt для форматирования более длинных текстов с хорошими («оптимальными») разрывами строк. Однако, если текст содержит любые escape-последовательности ANSI (которые никогда не отображаются и служат только для цветного текста при его отображении), fmt рассматривает их как обычные символы и вычисляет неправильные длины строк.Как скрыть коды отмены цвета ANSI от fmt

Я не уверен, что здесь работают хорошие буквенные символы-escape, так что вот простой пример использования grep для генерации последовательностей ANSI. Начнем с длинной строки для форматирования.

string="Here’s an example of a rather long \ 
string with quite a few words in the middle \ 
that grep chooses to colour red." 

Если мы не выделить grep матчи, все работает отлично:

echo $string | grep --color=no i | fmt -w 50 

Но если мы выделим/цвет их, fmt считает строки, содержащие букву «Я» гораздо больше чем они есть на самом деле, и они отображаются как короткие линии при отображении в терминале.

echo $string | grep --color=yes i | fmt -w 50 

Есть ли способ избежать этого? В этом примере я мог бы, конечно, использовать fmtдоgrep, но если строка поиска содержит несколько слов, это не сработает.

ответ

5

Невозможно решить эту проблему с помощью grep и fmt. Я рекомендую сначала запустить fmt, а затем использовать sed вместо grep для поиска. Например:

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

Спасибо. Это решение, которое я использовал. Мое реальное использование этого на самом деле включает 'sed' вместо' grep'. В принципе, я конвертирую теги (например, '|' в 'this is example | string') в последовательности цветов ANSI, чтобы покрасить слова, которые они охватывают. Использование 'fmt' перед заменой не является оптимальным, поскольку теги занимают некоторое пространство, которое влияет на перенос слов, но это не так уж плохо, если строка не содержит очень много таких тегов, и это лучше, чем запуск' fmt' после заменяя (поскольку escape-последовательности ANSI занимают больше символов). –

0

Использование `grep --colour = auto 'вместо этого решит проблему.

+0

Нет, это не так. Использование 'grep --colour = auto' имеет тот же результат, что и использование' grep --colour = no' в этом примере. –