У меня есть сценарий, который производит вывод с цветами, и мне нужно удалить коды ANSI.
#!/bin/bash
exec > >(tee log) # redirect the output to a file but keep it on stdout
exec 2>&1
./somescript
Вывод (в файле журнала):
java (pid 12321) is running...@[60G[@[0;32m OK @[0;39m]
Я не знал, как поместить здесь символ ESC, поэтому я поставил @
его на место.
Я изменил сценарий на:
#!/bin/bash
exec > >(tee log) # redirect the output to a file but keep it on stdout
exec 2>&1
./somescript | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
Но теперь это дает мне (в файле журнала):
java (pid 12321) is running...@[60G[ OK ]
Как я могу также удалить это @[60G
?
Может быть, есть способ полностью отключить раскраску для всего сценария?
strip-ansi
: github.com/chalk/strip-ansi .Ответы:
Согласно Википедии ,
[m|K]
используемаяsed
вами команда специально предназначена для обработкиm
(команда color) иK
(команда «erase part of line»). Ваш скрипт пытается установить абсолютную позицию курсора в 60 (^[[60G
), чтобы получить все ОК в строке, которую вашаsed
строка не покрывает.(Правильно,
[m|K]
вероятно , должно быть(m|K)
или[mK]
, потому что вы не пытаетесь сопоставить характер трубы. Но это сейчас не важно.)Если вы переключите это последнее совпадение в своей команде на
[mGK]
или(m|G|K)
, вы сможете перехватить эту дополнительную последовательность управления.источник
brew install gnu-sed
установит способную версию. Беги сgsed
.echo "$(tput setaf 1)foo$(tput sgr0) bar" | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" | cat -A
, я получу:foo^O bar$
Итак, я полагаю, некоторые персонажи удалены неправильно, верно? Вы знаете, как исправить?setaf
поддержка), требуют больше параметров, чем два; мое регулярное выражение поддерживает два. Поменять первое значение?
на*
должно помочь. Обработкаsgr0
возможна, но на основе поиска она, вероятно, выходит за рамки этого хакерского ответа на основе регулярных выражений.sed
к трубе, чтобы удалить символ "shift in"[38;5;45m
). Этот альтернативный ответ работает unix.stackexchange.com/a/55547/168277Я не смог получить приличные результаты ни от одного из других ответов, но мне помогло следующее:
Если я удалил только контрольный символ «^ [», он оставил остальные данные цвета, например, «33m». В том числе цветовой код и «м» сделали свое дело. Я озадачен тем, что s / \ x1B // g не работает, потому что \ x1B [31m определенно работает с echo.
источник
-E
вместо-r
расширенного регулярного выражения. Больше можно найти здесь{1,3}
на{,3}
( в противном случае он был еще пропуская некоторые элементы управления), спасибо за ваше решение!sed -r "s/[[:cntrl:]]\[([0-9]{1,3};)*[0-9]{1,3}m//g"
ИМХО, большинство из этих ответов слишком стараются ограничить то, что находится внутри escape-кода. В результате они теряют общие коды, такие как
[38;5;60m
(основной цвет ANSI 60 из 256-цветного режима).Им также требуется
-r
опция, которая включает расширения GNU . Это не обязательно; они просто делают регулярное выражение лучше.Вот более простой ответ, который обрабатывает переходы с 256 цветами и работает в системах с не-GNU
sed
:Это поймает все, что начинается с
[
, имеет любое количество десятичных знаков и точек с запятой и заканчивается буквой. Это должно поймать любую из общих escape-последовательностей ANSI .Для фанатов вот более масштабное и более общее (но минимально проверенное) решение для всех возможных выходных последовательностей ANSI :
(и если у вас проблема с SI в edi9999, добавьте
| sed "s/\x0f//g"
в конец; это работает для любого контрольного символа , заменяя0f
его шестнадцатеричным символом)источник
|
в sed,]
внутри класса символов в sed и'
в строке bash в одинарных кавычках. Сейчас он работает для меня на очень простой тестовый пример.Для Mac OSX или BSD использовать
источник
-E
флаг для sed, чтобы включить расширенное регулярное выражение.У меня также была проблема, что иногда появлялся символ СИ.
Это случилось, например, с этим входом:
echo "$(tput setaf 1)foo$(tput sgr0) bar"
Вот способ также удалить символ СИ (сдвиг) (0x0f)
источник
Хм, не уверен, что это будет работать для вас, но 'tr' удалит (удалит) контрольные коды - попробуйте:
источник
rwxr-xr-x 1 tokra admin 22 Oct 18 14:21 [0m[01;36m/usr/local/opt/gradle[0m -> [01;34m../Cellar/gradle/4.2.1[0m/
У меня была похожая проблема. Все решения, которые я нашел, работали хорошо для цветовых кодов, но не удаляли добавленные символы
"$(tput sgr0)"
(сброс атрибутов).Взяв, к примеру, решение в комментарии davemyron, длина полученной строки в приведенном ниже примере равна 9, а не 6:
Для правильной работы регулярное выражение должно быть расширено, чтобы также соответствовать последовательности, добавленной
sgr0
("\E(B
"):источник
Гораздо более простая функция в чистом Bash для фильтрации общих кодов ANSI из текстового потока:
Видеть:
источник
tldr
. (Хотя я использую zsh, так что это может быть и из-за этого.)extglob
или, вероятно, не поймет заменители строк вообще.sed
упомянутых здесь, которые будут работать с Zsh.Решение @ jeff-bowman помогло мне избавиться от НЕКОТОРЫХ цветовых кодов. Я добавил еще одну небольшую часть в регулярное выражение, чтобы удалить еще:
источник
Вот чистое решение Bash.
Сохраните как
strip-escape-codes.sh
, сделайте исполняемый файл и затем запустите<command-producing-colorful-output> | ./strip-escape-codes.sh
.Обратите внимание, что это удаляет все escape-коды / последовательности ANSI. Если вы хотите удалить только цвета, замените
[a-zA-Z]
на"m"
.Bash> = 4.0:
Баш <4.0:
источник
Спорная идея будет перенастроить настройки терминала для этого окружение процесса, чтобы процесс знает, что терминал не поддерживает цвета.
Нечто подобное
TERM=xterm-mono ./somescript
приходит мне в голову. YMMV с вашей конкретной ОС и способностью вашего скрипта понимать настройки цвета терминала.источник
Это работает для меня:
источник
somescript
это реализовано. Он может или не может признать, что его стандартный вывод является tty. (Слова «оскорбители» на самом деле жестко зашифровывают специфические для терминала коды перехода в программу и ужасно ломаются при использовании на других терминалах или в сценариях).