2013-08-01 6 views
53

Ho uno script che produce colori e ho bisogno di liberarmene.Rimozione dei colori dall'output

#!/bin/bash 

exec > >(tee log) # redirect the output to a file but keep it on stdout 
exec 2>&1 

./somescript 

L'uscita è (in file di log):

java (pid 12321) is [email protected][60G[@[0;32m OK @[0;39m] 

Non sapevo come mettere il carattere ESC qui, così ho messo @ al suo posto.

ho cambiato lo script in:

#!/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" 

Ma ora mi dà (in file di log):

java (pid 12321) is [email protected][60G[ OK ] 

Come posso anche rimuovere questo '@[60G?

Forse c'è un modo per disattivare completamente la colorazione per l'intera sceneggiatura?

risposta

76

According to Wikipedia, che conosce tutte le cose, il [m|K] nel comando sed si sta utilizzando è specificamente progettato per gestire m (il comando colore) e K (la "cancellare parte linea di comando"). Lo script sta tentando di impostare la posizione assoluta del cursore su 60 (^[[60G) per ottenere tutti gli OK in una riga, che la linea sed non copre.

(correttamente, [m|K] dovrebbe probabilmente essere (m|K) o [mK], perché non state cercando di abbinare un carattere pipe. Ma non è importante in questo momento.)

Se si passa che partita finale nel comando a [mGK] oppure (m|G|K), dovresti essere in grado di catturare quella sequenza di controllo extra.

./somescript | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" 
+12

Utenti BSD/OSX: Di solito non abbiamo l'opzione -r per sed. 'brew install gnu-sed' installerà una versione capace. Corri con 'gsed'. –

+0

Se faccio 'echo" $ (tput setaf 1) foo $ (tput sgr0) bar "| sed -r "s/\ x1B \ [([0-9] {1,2} (; [0-9] {1,2})?)? [mGK] // g" | cat -A', ottengo: 'foo^O bar $' Quindi immagino che alcuni caratteri non siano stati rimossi correttamente, giusto? Sai come correggere? – edi9999

+1

@ edi9999 Per quanto ne so, la differenza è che le impostazioni del colore oltre i 16 colori (come i supporti di 'setaf') richiedono più parametri di due; il mio regex supporta due. Cambiare il primo '?' Per '*' dovrebbe aiutare. La gestione di 'sgr0' è possibile ma basata su una ricerca che probabilmente cresce al di fuori dello scopo di questa risposta basata su regex. –

10

Hmm, non so se questo funzionerà per voi, ma 'tr' sarà 'strip' (eliminare) codici di controllo - provare:

./somescript | tr -d '[:cntrl:]' 
+10

All'improvviso vengono rimosse anche nuove righe – ruX

+0

Sì, LF e CR (codici) sono codici di controllo; se sei interessato a più di una linea, questa potrebbe non essere una soluzione. Poiché sembra che tu stia eseguendo un programma JAVA, suppongo che i colori siano gestiti da lì; Altrimenti dovresti vedere la configurazione della tua console (cioè impostazioni del terminale/combinazione di colori) e/o le opzioni per ogni comando che supporta i 'colori', es. Ls --color = mai –

+0

Mi piace questa risposta per la sua eleganza, anche se fa più della semplice rimozione dei colori. Grazie! –

5

Inoltre ho avuto il problema che a volte , è apparso il carattere SI.

E 'successo per esempio con questo ingresso: echo "$(tput setaf 1)foo$(tput sgr0) bar"

Ecco un modo per togliere anche il carattere SI (shift in) (0x0F)

./somescript | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" | sed "s/\x0f//g" 
+0

Non so perché questa risposta riceve così poco credito. Questo è l'unico che funziona per me ... – m8mble

3

@ soluzione di Jeff-Bowman mi ha aiutato a sbarazzarsi di ALCUNI dei codici colore. ho aggiunto un'altra piccola porzione alla regex al fine di rimuovere un po ':

sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" # Original. Removed Red ([31;40m[1m[error][0m) 
sed -r "s/\x1B\[([0-9];)?([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" # With an addition, removed yellow and green ([1;33;40m[1m[warning][0m and [1;32;40m[1m[ok][0m) 
       ^^^^^^^^^ 
       remove Yellow and Green (and maybe more colors) 
-5

questo funziona per me:

./somescript | cat 
+1

Dipende da come 'somescript' è implementato. Può o non può riconoscere che il suo output standard è un tty. (Le parole trasgressori in realtà codificano i codici di escape specifici del terminale nel programma e si interrompono orribilmente quando vengono utilizzati su altri terminali o in script). –

+0

Grazie Toby. Ho usato django's manage.py per testare, ma quello che hai detto ha senso. – spiderlama

5

non ho potuto ottenere risultati decenti da una qualsiasi delle altre risposte, ma le seguenti ha lavorato per me:

somescript | sed -r "s/[[:cntrl:]]\[[0-9]{1,3}m//g" 

Se ho rimosso solo il carattere di controllo "^ [", ha lasciato il resto dei dati relativi al colore, ad esempio, "33m". Compreso il codice colore e "m" ha fatto il trucco. Sono confuso con s/\ x1B // g non funziona perché \ x1B [31m funziona sicuramente con l'eco.

+1

Su OSX (BSD sed), usare '-E' invece di' -r' per espressioni regolari estese. Altro potrebbe essere trovato [qui] (https://unix.stackexchange.com/a/131940) – Assambar