Como colorir algumas strings em um arquivo

1

Eu preparo um arquivo Hello.txt da seguinte forma.

1253125213
213532135
23513125215

Depois, quero colorir cada linha em azul, exceto "2", e colorir o "2" em vermelho.

Primeiro, eu escrevi

BLUE='3[0;34m'
RED='3[0;31m'

e tentou fazer sed 's/2/${RED}2${BLUE}/' , mas isso não é trabalho.

Como faço isso?

    
por user53216 20.04.2016 / 16:45

2 respostas

2

Primeiramente, aspas duplas são necessárias para a interpolação:

$ sed "s/2/${RED}2${BLUE}/" Hello.txt
1233[0;31m2233[0;34m53125213
233[0;31m2233[0;34m13532135
233[0;31m2233[0;34m3513125215

No entanto, as seqüências de escape ASCII contêm caracteres que afetam sed, portanto, você precisa converter a seqüência de caracteres de escape em caracteres de controle reais. Isso pode ser feito através do uso de um subshell. Observe o /g final, o que significa que várias substituições são permitidas por linha.

$ sed "s/2/'echo $RED'2'echo $BLUE'/g" Hello.txt

Agora,issoaindanãoestácerto.Oquerealmentedeveríamosfazeréconfigurarcadalinhaparacomeçaremazule,emseguida,fazercomquecadasubstituiçãode2comeceemvermelhoetermineemazul.Ocaracteredechapéu,^,éumaexpressãoregularquesignificaoiníciodeumalinha.Observetambémostuboseorearranjoparausarcat.

$catHello.txt|sed"s/^/'echo $BLUE'/" | sed "s/2/'echo $RED'2'echo $BLUE'/g"

Vocêtambémpodetorná-lomaislimpo,movendoaconversãodesubshellparasuaatribuiçãodevariável.OscolchetesencaracoladossãonecessáriosparaRED,demodoadistingui-lodocaractere2paraqueelenãotenteusaravariávelinexistenteRED2.

$BLUE='echo'3[0;34m''$RED='echo'3[0;31m''$catHello.txt|sed"s/^/$BLUE/" | sed "s/2/${RED}2${BLUE}/g"

Fonte: link

    
por 20.04.2016 / 16:57
1

Como já explicado pelo ZimbiX, use aspas duplas et cetera.

Uma alternativa ao seu método é usar a sintaxe $'…' onde as seqüências de escape são interpretadas. Ou seja:

\e    => ASCII ESC (0x1b, 033)
3  => ASCII ESC (0x1b, 033)
\x1b  => ASCII ESC (0x1b, 033)

Então:

red=$'\e[31m'
blue=$'\e[34m'

Então:

printf $blue && sed "s/2/${red}2$blue/g" Hello.txt

Ou, se quiser, inclua uma variável reset :

cc=$'\e[0m'
printf $blue && sed "s/2/$cc${red}2$cc$blue/g" Hello.txt && printf $cc

Para ver o código, diga algo como:

(printf $blue && sed "s/2/${red}2$blue/g" Hello.txt) | cat -v

Observe também o uso de g para global em sed .

    
por 20.04.2016 / 17:31

Tags