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

29

Eu tenho um script ksh que deve funcionar no linux e no solaris. Estou tentando colorir a saída de comandos específicos. Funciona no linux (especificamente RHEL6), mas não no solaris (SunOS 5.10).

Comando no linux (a saída "test" está corretamente vermelha):

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

Comando no solaris (a saída "teste" não é colorida):

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

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

acm
fonte

Respostas:

35

\xNN é uma sequê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 printfpara gerar um caractere de escape. Entende escapes octais, não hexadecimais.

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

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

echo "test" | sed "s,.*,$(tput setaf 1)&$(tput sgr0),"
Gilles 'SO- parar de ser mau'
fonte
isso funciona muito bem para colorir cat |sedmuito thx!
Poder de Aquário
8

Seria mais fácil usar tput

tput setaf 1; somecommand; tput sgr0

ou

tput setaf 1
somecommand
tput sgr0

Isso define o primeiro plano como vermelho, as execuções somecommandque exibem a saída em vermelho e depois limpam a sequência de cores. Isso funciona pelo menos com bash, zshe ksh.

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

bahamat
fonte
Obrigado pela resposta. Como eu disse anteriormente, não posso alterar o comando echo. 'eco' é apenas um substituto para o processo que estou chamando, que não posso mudar. É possível usar sed com tput de alguma forma? Além disso, quando executo esse comando no sunOS 5.10, não vejo cores.
Acm
Eu o atualizei para dividi-lo em comandos separados.
bahamat
Isso é melhor do que minha implementação atual, pois ela não imprime códigos ASCII brutos no solaris. No entanto (por qualquer motivo), ele não colore a saída de 'algum comando' no solaris. Faz no linux. Aceitei a resposta @Gilles, que faz as duas coisas. Obrigado.
Acm
0

Alguns terminais (como o bash no iterm para mim) permitem que você pressione as teclas "ctrl-v", seguidas de "ctrl + [" e colocará o caractere de escape literal na string de entrada. Se funcionar, você provavelmente verá os caracteres "^ [" impressos na tela, mas se você mover o cursor ao redor dele, ele será tratado como um caractere, porque realmente está nos bastidores.

Para entender o que está acontecendo (e testar se isso é possível), você pode digitar ctrl + v seguido de ctrl + i. Você deve ver que o caractere de tabulação foi inserido na sua string de prompt. Há um histórico do CS para explicar por que esse é o caso: mas acontece que o teclado muito antigo tinha ctrl + que eu havia ligado para enviar o caractere de tabulação; e a tecla Tab também envia o mesmo sinal elétrico.

Por esse motivo legado, o bash para muitos terminais ainda interpreta certos códigos ctrl para mapear para os mesmos caracteres.

Ctrl + I mapeia o caractere de tabulação e ctrl + [coincide com o caractere de escape ascii.

Alexander Bird
fonte