I caratteri ^[[37me ^[[0mfanno 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
( sednon supporta alternative \ee \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 sedcomando predefinito non supporta caratteri speciali \ecome indicato da slm e steamer25 nei commenti. Usa invece gsedche 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 mspecifica 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 Kdeve essere utilizzato anche per mrimuovere i colori da gccerrori / 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 sedinstallata su alcuni sistemi operativi potrebbe essere limitata (ad es. MacOS). Il comando perlha 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 sedriga di comando viene utilizzata dal progetto Ultimate Nginx Bad Bot (1000 stelle) per ripulire il rapporto e-mail ;-)
moreoless -Rche può interpretare i codici di escape come colore anziché come un editor di testo.