Usando sed para colorir a saída de um comando no solaris

22

Eu tenho um script ksh que deve funcionar tanto no Linux quanto no Solaris. Estou tentando colorir a saída de comandos específicos. Ele funciona no Linux (especificamente no RHEL6), mas não no Solaris (SunOS 5.10).

Comando no linux (o "teste" de saída está corretamente colorido em vermelho):

[amartin@linuxbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,'
test

Comando no solaris (o "teste" de saída não é colorido):

[amartin@sunbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,'
x1B[31mtestx1B[0m

Existe uma maneira de criar esse comando de forma que a saída fique vermelha, sem os códigos brutos na saída? Não consigo alterar o comando 'echo' porque isso é apenas um preenchimento do comando que estou executando.

    
por acm 20.08.2012 / 20:21

2 respostas

24

\xNN é uma seqüência de escape no GNU sed, mas não é padrão e, em particular, não está disponível no Solaris.

Você pode incluir um caractere de escape literal em seu script, mas isso dificultaria a leitura e a edição.

Você pode usar printf para gerar um caractere de escape. Entende escapes octal, não hexadecimal.

esc=$(printf '3')
echo "test" | sed "s,.*,${esc}[31m&${esc}[0m,"

Você pode chamar tput para gerar o texto de substituição na chamada para sed. Esse comando procura sequências de escape no banco de dados terminfo . Em teoria, usar tput torna seu script mais portátil, mas, na prática, é improvável que você encontre um terminal que não use ANSI códigos de escape .

echo "test" | sed "s,.*,$(tput setaf 1)&$(tput sgr0),"
    
por 21.08.2012 / 01:34
6

Seria mais fácil usar tput

tput setaf 1; somecommand; tput sgr0

ou

tput setaf 1
somecommand
tput sgr0

Isso define o primeiro plano para vermelho, executa somecommand , que exibirá a saída em vermelho e, em seguida, limpa a sequência de cores. Isso funciona pelo menos com bash , zsh e ksh .

Veja tmux(1) e terminfo(5) para mais informações sobre o que você pode fazer com tput .

    
por 20.08.2012 / 21:13