Символы ^[[37m
и ^[[0m
являются частью escape-последовательностей ANSI (коды CSI) . Смотрите также эти спецификации .
Использование GNU sed
sed 's/\x1b\[[0-9;]*m//g'
\x1b
(или \x1B
) является специальным символом escape
( sed
не поддерживает альтернативы \e
и \033
)
\[
является вторым символом escape-последовательности
[0-9;]*
это значение цвета (s) регулярное выражение
m
последний символ escape-последовательности
⚠ На MacOS, по умолчанию sed
команда не поддерживает специальные символы , такие как , \e
как указывал слм и steamer25 в комментариях. Используйте вместо этого, gsed
что вы можете установить с помощью brew install gnu-sed
.
Пример с командной строкой OP : (OP означает оригинальный постер)
perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' |
sed 's/\x1b\[[0-9;]*m//g'
Том Хейл предлагает удалить все другие escape-последовательности, используя [a-zA-Z]
вместо буквы, m
специфичной для escape-последовательности графического режима (цвета). Но [a-zA-Z]
может быть слишком широким и может удалить слишком много. Михал Фаленски и Мигель Мота предлагают удалить только некоторые escape-последовательности, используя [mGKH]
и [mGKF]
соответственно. Бриттон Керин указывает, что K
также должен использоваться в дополнение к m
удалению цветов из сообщения gcc
об ошибке / предупреждении (не забудьте перенаправить gcc 2>&1 | sed...
).
sed 's/\x1b\[[0-9;]*m//g' # Remove color sequences only
sed 's/\x1b\[[0-9;]*[a-zA-Z]//g' # Remove all escape sequences
sed 's/\x1b\[[0-9;]*[mGKH]//g' # Remove color and move sequences
sed 's/\x1b\[[0-9;]*[mGKF]//g' # Remove color and move sequences
Last escape
sequence
character Purpose
--------- -------------------------------
m Graphics Rendition Mode (including Color)
G Horizontal cursor move
K Horizontal deletion
H New cursor position
F Move cursor to previous n lines
С помощью perl
Версия sed
установленной в некоторых операционных системах может быть ограничена (например, MacOS). Преимущество этой команды perl
в том, что ее обычно проще устанавливать / обновлять в более операционных системах. Адам Кац предлагает использовать \e
(так же, как \x1b
) в PCRE .
Выберите свое регулярное выражение в зависимости от того, сколько команд вы хотите отфильтровать:
perl -pe 's/\e\[[0-9;]*m//g' # Remove colors only
perl -pe 's/\e\[[0-9;]*[mG]//g'
perl -pe 's/\e\[[0-9;]*[mGKH]//g'
perl -pe 's/\e\[[0-9;]*[a-zA-Z]//g'
perl -pe 's/\e\[[0-9;]*m(?:\e\[K)?//g' # Adam Katz's trick
Пример с командной строкой OP:
perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' \
| perl -pe 's/\e\[[0-9;]*m//g'
использование
Как указано в комментарии Стюарта Кардалла , эта sed
командная строка используется проектом Ultimate Nginx Bad Bot (1000 звезд) для очистки отчета по электронной почте ;-)
more
илиless -R
которые могут интерпретировать escape-коды как цвет вместо текстового редактора.