sed - найти правильную последовательность цветов для расширенных 256 цветов ANSI

sed - найти правильную последовательность цветов для расширенных 256 цветов ANSI

В настоящее время я использую следующую команду для использования стандартных цветов ANSI с командой tail:

tail -f syslogfile | sed -e 's/\(.*MAJOR.*\)/\o033[93m\1\o033[39m/'

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

echo -e "\\033[40;5;95;38;5;202mhello world\\033[0m"

Однако у меня возникли проблемы с переводом этого в команду sed, которую можно использовать с командой tail.

Я попробовал это:

sed -e 's/\(.*MAJOR.*\)/\033[40;5;95;38;5;202\033[0m/'

Но это оставляет все белым. Я пробовал:

sed -e 's/\(.*MAJOR.*\)/\o033[40;5;95;38;5;202\o033[0m/'

Но это затемняет строки, содержащие строку "MAJOR". Я также пробовал убрать фоновую схему и использовать только оранжевый:

sed -e 's/\(.*MAJOR.*\)/\033[38;5;202\033[0m/'

Но это также, кажется, затемняет строки, содержащие слово "MAJOR". Кто-нибудь знает, какая правильная последовательность ANSI будет для sed, чтобы выдать мне оранжевый на черном? К вашему сведению, команда sed, которую я использовал в своем первом примере, печатает всю строку выбранным цветом, и мне нужно то же самое поведение с новой последовательностью цветов, а не просто раскрашивать само слово.

ОБНОВЛЯТЬ:

Это работает:

sed -e 's/\(.*MINOR.*\)/\o033[38;5;202m\1\o033[40;5;95m/'

Но оставляет другие строки, которые не содержат НЕБОЛЬШОЙ цвет пурпурного цвета. Как мне вернуть их обратно к белому цвету по умолчанию? Я что-то не правильно отключаю? На самом деле он делает цвет шрифта по умолчанию для всей оболочки пурпурным, как я вижу, когда завершаю команду tail.

решение1

При создании сценария ваших примеров можно увидеть несколько проблем:

#!/bin/sh
MSG="this is MAJOR stuff"
echo "$MSG" | sed -e 's/\(.*MAJOR.*\)/\o033[93m\1\o033[39m/'
echo "$MSG" | sed -e 's/\(.*MAJOR.*\)/\033[40;5;95;38;5;202\033[0m/'
echo "$MSG" | sed -e 's/\(.*MAJOR.*\)/\o033[40;5;95;38;5;202\o033[0m/'
echo "$MSG" | sed -e 's/\(.*MAJOR.*\)/\033[38;5;202\033[0m/'

что производит ( ^[это экранирование):

^[[93mthis is MAJOR stuff^[[39m
this is MAJOR stuff33[40;5;95;38;5;202this is MAJOR stuff33[0m
^[[40;5;95;38;5;202^[[0m
this is MAJOR stuff33[38;5;202this is MAJOR stuff33[0m

В первой строке a ^[[93m— это 16-цветный escape-код aixterm, который устанавливает желтый цвет текста и ^39mсбрасывает текст до цветов терминала по умолчанию.

Во второй строке возникают проблемы с незавершенной escape-последовательностью (которая начинается с установки черного фона = 40, мигания = 5, 95 = ярко-пурпурного текста, затем 38 и 5 пытаются ввести последовательность из 256 цветов, которая не завершается).

Третья строка представляет собой небольшую вариацию второй.

Основная проблема в том, что ваш sedэкранированный символ не выводится, если вы не выразите его как \o033(что выделалсделать в нескольких местах).

Во-вторых, вы не заканчиваете экраны должным образом. Этот финал m— часть последовательности. Если последний символ отсутствует, то вся последовательность может быть отброшена. Лучше всего прочитать документацию:Последовательности управления XTerm.

Кстати,АНСИникогда не документировал ничего, что содержало бы более 8 цветов, поэтому будет менее запутанным ссылаться на последовательности по оригинальной реализации (aixterm для 16 цветов, xterm для 256 цветов).

Если вам просто нужны целые строки сГЛАВНЫЙвыделено оранжевым цветом, то (судя по комментариям) можно было бы сделать так:

sed -e 's/^\(.*MAJOR.*\)$/\o033[48;5;95m\1\o033[m/'

Однако этот 5код поддерживается не так широко, как код 2с использованием R/G/B, например:

sed -e 's/^\(.*MAJOR.*\)$/\o033[48;2;128;128;0m\1\o033[m/'

(128 — это всего лишь первая попытка, ваши вкусы могут отличаться).

Дальнейшее чтение:

CSI Pm m Character Attributes (SGR).

решение2

Вероятно, вы ищете это:

sed -e 's/\(.*MAJOR.*\)/\o033[48;5;95;38;5;202m\1\o033[0m/'

хотя это можно упростить с помощью

sed -e 's/.*MAJOR.*/\o033[48;5;95;38;5;202m&\o033[m/'

Обратите внимание на изменение на 40, 48которое означает, что мы хотим изменить цвет фона.

Если вы хотите, чтобы цвет фона был черным:

sed -e 's/.*MAJOR.*/\o033[40;38;5;202m&\o033[m/'

а если цвет фона уже черный, то вам вообще не нужно его менять:

sed -e 's/.*MAJOR.*/\o033[38;5;202m&\o033[m/'

Связанный контент