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