Изучение выхода из
perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";'
в текстовом редакторе (например, vi
) отображается следующее:
^[[37mABC
^[[0m
Как можно удалить цветовые коды ANSI из выходного файла? Я полагаю, что лучшим способом было бы передать вывод через своего рода потоковый редактор.
Следующее не работает
perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' | perl -pe 's/\^\[\[37m//g' | perl -pe 's/\^\[\[0m//g'
more
илиless -R
которые могут интерпретировать escape-коды как цвет вместо текстового редактора.Ответы:
Символы
^[[37m
и^[[0m
являются частью escape-последовательностей ANSI (коды CSI) . Смотрите также эти спецификации .Использование GNU
sed
\x1b
(или\x1B
) является специальным символом escape(
sed
не поддерживает альтернативы\e
и\033
)\[
является вторым символом escape-последовательности[0-9;]*
это значение цвета (s) регулярное выражениеm
последний символ escape-последовательности⚠ На MacOS, по умолчанию
sed
команда не поддерживает специальные символы , такие как ,\e
как указывал слм и steamer25 в комментариях. Используйте вместо этого,gsed
что вы можете установить с помощьюbrew install gnu-sed
.Пример с командной строкой OP : (OP означает оригинальный постер)
Том Хейл предлагает удалить все другие escape-последовательности, используя
[a-zA-Z]
вместо буквы,m
специфичной для escape-последовательности графического режима (цвета). Но[a-zA-Z]
может быть слишком широким и может удалить слишком много. Михал Фаленски и Мигель Мота предлагают удалить только некоторые escape-последовательности, используя[mGKH]
и[mGKF]
соответственно. Бриттон Керин указывает, чтоK
также должен использоваться в дополнение кm
удалению цветов из сообщенияgcc
об ошибке / предупреждении (не забудьте перенаправитьgcc 2>&1 | sed...
).С помощью
perl
Версия
sed
установленной в некоторых операционных системах может быть ограничена (например, MacOS). Преимущество этой командыperl
в том, что ее обычно проще устанавливать / обновлять в более операционных системах. Адам Кац предлагает использовать\e
(так же, как\x1b
) в PCRE .Выберите свое регулярное выражение в зависимости от того, сколько команд вы хотите отфильтровать:
Пример с командной строкой OP:
использование
Как указано в комментарии Стюарта Кардалла , эта
sed
командная строка используется проектом Ultimate Nginx Bad Bot (1000 звезд) для очистки отчета по электронной почте ;-)источник
sed
команду и объяснение. :)1;31m
так что лучше добавьте его;
в регулярное выражение:cat colored.log | sed -r 's/\x1b\[[0-9;]*m//g'
иначе они не будут удалены.sed
не работает с показанным примером,gsed
однако версия работает.brew install gnu-sed
.Я нашел лучший способ удаления последовательности побега. Проверь это:
perl -pe 's/\x1b\[[0-9;]*[mG]//g'
источник
sed -r
как НЕ.Что отображается как
^[
это не^
и[
; это символ ASCIIESC
, созданный с помощью Escили Ctrl[(^
обозначение означает клавишу Ctrl).ESC
0x1B шестнадцатеричный или 033 восьмеричный, поэтому вы должны использовать\x1B
или\033
в своих регулярных выражениях:источник
Если вы предпочитаете что-то простое, вы можете использовать модуль strip-ansi ( требуется Node.js ):
Тогда используйте это так:
Или просто передайте строку:
источник
cat
( UUOC ) - это должно быть возможноstrip-ansi colors.o
или по крайней мереstrip-ansi < colors.o
.strip-ansi < colors.o
, но по опыту люди лучше знакомы с трубопроводами. Я обновил ответ.commandlinefu дает этот ответ, который отбрасывает цвета ANSI, а также команды перемещения:
Для только цветов, вы хотите:
источник
Я считаю, что это авторитетное удаление всех escape-последовательностей ANSI :
(Обратите внимание , что PERL, как и многие другие языки (но не СЭД), принимает в
\e
качестве экранирующего символа Esc,\x1b
или с\033
помощью кода, показанного в терминалах , как^[
. Я использую его здесь , потому что кажется более понятным.)Эта команда perl, которую вы можете запустить все в одну строку, если хотите, содержит четыре замены:
Первый идет после последовательностей CSI (последовательности escape-кодов, начинающиеся с «Представителя управляющих последовательностей» Esc[, который охватывает гораздо больше, чем последовательности Select Graphic Rendition, которые составляют цветовые коды и другие текстовые декорации).
Вторая замена удаляет оставшиеся последовательности, которые включают в себя завершающие символы и оканчиваются на ST (терминатор строки, Esc\). Третья замена это то же самое , но также позволяет команд операционной системы последовательности , чтобы закончить с BEL (
\x07
,\007
часто\a
).Четвертая замена удаляет оставшиеся побеги.
Также рассмотрите возможность удаления других символов ASCII нулевой ширины, таких как BEL и других более неясных управляющих символов C0 и C1 . Я использую
s/[\x00-\x1f\x7f-\x9f\xad]+//g
, который также включает Delete и Soft Hyphen . Это исключает более длинные закодированные символы Unicode с нулевой шириной, но я считаю, что это является исчерпывающим для ASCII (Unicode\x00
-\xff
). Если вы сделаете это, удалите эти последние, поскольку они могут быть включены в более длинные последовательности.источник
«Ответ» на вопрос не сработал для меня, поэтому я вместо этого создал это регулярное выражение для удаления escape-последовательностей, создаваемых модулем perl Term :: ANSIColor.
Регулярное выражение Grawity должно работать нормально, но использование + тоже работает нормально.
источник
The "answered" question
? Вы имеете в виду принятый ответ? (2) Эта команда не работает - она даже не выполняется - потому что имеет непревзойденную (несбалансированную) кавычку. (3) Это бесполезное использованиеcat
( UUOC ) - это должно быть возможно сделать . (4) Кто-нибудь говорил что-нибудь о кодах в файле?perl -pe
command
colors.o
.o
«tput sgr0» оставил этот управляющий символ ^ (B ^ [
Вот модифицированная версия, чтобы позаботиться об этом.
источник
tput sgr0
, от чего другие решения, кажется, никогда не смогут избавиться.У меня была похожая проблема с удалением символов, добавленных из сбора интерактивного верхнего вывода через замазку, и это помогло:
источник
cat
( UUOC ) - это должно быть возможно сделать .perl -pe
command
putty1.log
Это то, что у меня сработало (проверено на Mac OS X)
источник