Символи ^[[37m
та ^[[0m
є частиною послідовностей аварійних передач ANSI (коди CSI) . Дивіться також ці специфікації .
Використання GNU sed
sed 's/\x1b\[[0-9;]*m//g'
\x1b
(або \x1B
) є спеціальним символом втечі
( sed
не підтримує альтернативи \e
та \033
)
\[
є другим символом послідовності втечі
[0-9;]*
- значення кольору (s)
m
є останнім символом послідовності втечі
У macOS sed
команда за замовчуванням не підтримує спеціальні символи, як, наприклад \e
, вказано slm та 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'
Том Хейл пропонує видалити всі інші послідовності евакуації, використовуючи [a-zA-Z]
замість лише букву, m
специфічну для графічного режиму (кольору) послідовності виходу. Але [a-zA-Z]
може бути занадто широким і може видалити занадто багато. Міхал Faleński і Miguel Mota пропонують видалити тільки деякі керуючі послідовності , використовуючи [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
який може інтерпретувати коди ескалації як колір замість текстового редактора.