2009-06-30 21 views
6

Sto cercando di prendere una riga di testo comeSfuggire il carattere '' nella stringa di sostituzione in un'espressione sed

13) Check for orphaned Path entries 

e modificarlo (voglio i codici colore bash per colorare l'uscita, non visualizzato sullo schermo)

\033[32m*\033[0m Check for orphaned Path entries 

con codici colore bash per colorare l'asterisco per farlo risaltare di più. Ho un comando sed che fa la maggior parte di questo, tranne che non gestisce correttamente i codici colore poiché li vede come riferimenti al testo sostitutivo.

Quello che ho finora:

sed "s/ *13) \(.*\)/ \033[32m*\033[0m \1/" 

che produce il seguente output quando viene eseguito sulla corda ho dato all'inizio:

13) Check for orphaned Path entries33[32m* 13) Check for orphaned Path entries33[0m Check for orphaned Path entries 

Si sta prendendo il \ 0 del \ 033 e sostituendolo con la stringa originale. Raddoppiare i backslash nella stringa di sostituzione non fa differenza; Ho ancora lo stesso testo di output.

Come si inseriscono i colori di bash in un'espressione di sostituzione sed?

+0

quadruplicando la backslash provocato lo stesso effetto usando le virgolette singole e bashslashes raddoppiato, come suggerito da @DreadPirateShawn. Ottengo \ 033 [32m * \ 033 [0m output direttamente sulla console, senza essere trasformato in codici colore. –

+0

Fondamentalmente è la stessa cosa. Ecco perché ho già eliminato il mio commento. – balpha

risposta

9

È probabile che lo sed che si sta utilizzando non comprenda ottale, ma potrebbe comprendere hex.Provate questa versione per vedere se funziona per voi (usando \x1b invece di \033):

sed "s/ *13) \(.*\)/ \x1b[32m*\x1b[0m \1/" 
+2

se groove ottale, usa \ o033 – Hasturkun

+0

@Hasturkun: Ecco perché vale la pena leggere il file delle informazioni. A volte l'uomo non lo taglia. Grazie per le informazioni. –

+0

@Dennis: Intendi dire che a volte l'uomo non ha lo stesso manuale delle informazioni? –

2

doppio le barre inverse nella stringa di sostituzione, uso singolo invece di virgolette intorno all'espressione sed:

sed 's/ *13) \(.*\)/ \\033[32m*\\033[0m \1/' 

impedisce alla shell di interferire con il comportamento sed.

~~~~~~~

Aggiornamento:

utilizzare uno script per ottenere colori in modo pulito:

colorize.sh

#!/bin/sh 

HIGHLIGHT=`echo -e '\033[32m'` 
NORMAL=`echo -e '\033[0m'` 

sed "s/ *13) \(.*\)/ $HIGHLIGHT*$NORMAL \1/" yourinputtext 
+0

Mentre sed non sta cercando di sostituire il \ 0 ora, non sto ancora ottenendo output colorato. –

+0

Per essere più specifico, ottengo l'output di \ 033 [32m * \ 033 [0m direttamente sulla console, senza essere trasformato in codici colore –

+0

Non so bene cosa intendi ... Il mio obiettivo era risolvere il problema di sfuggire al ' \ 'carattere nella stringa di sostituzione, e lo ha fatto - Ottengo lo stesso testo di output che citi nella stringa "cambia in" sopra. Oltre a ciò, sai cosa stai cercando per il colore più di me; volevo solo assicurarmi di avere gli strumenti inchiodati per farlo. :-) – DreadPirateShawn

-1

Prova questo:

sed "s/ *13) \(.*\)/ \\\\033 \1/" 

ie slash-sla sh-slash-slash-033

8

tua '\ 033' è in realtà un singolo carattere ESC (fuga), per emettere questo si può utilizzare uno qualsiasi dei la seguente:

  • \o033
  • \d027
  • \x1B
  • \c[ per CTRL-[
+0

+1 per il prefisso ottale - la maggior parte dei programmi riconosce solo lo zero iniziale. –

2

Ho avuto lo stesso problema e ho risolto in questo modo.

Si può cercare di modificare il codice:

sed "s/ *13) \(.*\)/ \033[32m*\033[0m \1/" 

in questo:

sed "s/ *13) \(.*\)/ $(echo '\033[32m')*$(echo '\033[0m') \1/" 

L'idea di base è quella di utilizzare 'echo' per il comando di fuga. Ha funzionato per me,

0

Io uso gawk

gawk -v string1=$STRING1 -v IGNORECASE=1 ' { gsub (string1 , "\033[1m&\033[0m") ; print } ' 
Problemi correlati