I caratteri ^[[37m
e ^[[0m
fanno parte delle sequenze di escape ANSI (codici CSI) . Vedi anche queste specifiche .
Usando GNU sed
sed 's/\x1b\[[0-9;]*m//g'
\x1b
(o \x1B
) è il carattere speciale di escape
( sed
non supporta alternative \e
e \033
)
\[
è il secondo carattere della sequenza di escape
[0-9;]*
è il valore del colore regex
m
è l'ultimo carattere della sequenza di escape
⚠ Su macOS, il sed
comando predefinito non supporta caratteri speciali \e
come indicato da slm e steamer25 nei commenti. Usa invece gsed
che puoi installare usando brew install gnu-sed
.
Esempio con la riga di comando di OP: (OP significa Poster originale)
perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' |
sed 's/\x1b\[[0-9;]*m//g'
Tom Hale suggerisce di rimuovere tutte le altre sequenze di escape utilizzando al [a-zA-Z]
posto della lettera m
specifica della sequenza di escape in modalità grafica (colore). Ma [a-zA-Z]
potrebbe essere troppo largo e potrebbe rimuovere troppo. Michał Faleński e Miguel Mota propongono di rimuovere solo alcune sequenze di escape usando [mGKH]
e [mGKF]
rispettivamente. Britton Kerin indica che K
deve essere utilizzato anche per m
rimuovere i colori da gcc
errori / avvisi (non dimenticare di reindirizzare 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
utilizzando perl
La versione sed
installata su alcuni sistemi operativi potrebbe essere limitata (ad es. MacOS). Il comando perl
ha il vantaggio di essere generalmente più facile da installare / aggiornare su più sistemi operativi. Adam Katz suggerisce di usare \e
(lo stesso di \x1b
) in PCRE .
Scegli la tua regex in base a quanti comandi vuoi filtrare:
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
Esempio con la riga di comando di OP:
perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' \
| perl -pe 's/\e\[[0-9;]*m//g'
uso
Come sottolineato dal commento di Stuart Cardall , questa sed
riga di comando viene utilizzata dal progetto Ultimate Nginx Bad Bot (1000 stelle) per ripulire il rapporto e-mail ;-)
more
oless -R
che può interpretare i codici di escape come colore anziché come un editor di testo.