Как скрыть цветовые коды ANSI от fmt - PullRequest
5 голосов
/ 13 июля 2009

Я использую (GNU) 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 считает, что строки, содержащие букву "i", намного длиннее, чем они есть на самом деле, и они отображаются как довольно короткие строки при отображении в терминале.

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

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

Ответы [ 3 ]

5 голосов
/ 13 июля 2009

Кажется, нет хорошего способа решить эту проблему с помощью 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 голосов
/ 09 сентября 2018

Для этого вы можете использовать hmt . Он был задуман именно для этого сценария.

Примечание: я являюсь автором hmt.

0 голосов
/ 16 февраля 2013

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

...