Substituir caracteres de destaque por outra coisa

0

Desejo substituir os códigos de cores por outra coisa. Por exemplo, executando o comando cal , quero obter algumas tags html em vez de códigos de cores:

     July 2015        
Su Mo Tu We Th Fr Sa  
          1  2  3  4  
 5  <strong>6</strong>  7  8  9 10 11  
12 13 14 15 16 17 18  
19 20 21 22 23 24 25  
26 27 28 29 30 31 

A execução de echo -e "\e[0;36m\e[41m some text" fornecerá a cor azul no fundo vermelho. Seguindo o mesmo exemplo, posso descobrir o código hexadecimal desta cor:

echo -e "\e[0;36m\e[41m" | hexdump

whitch 5b1b 3b30 3633 1b6d 345b 6d31 000a . Como faço para escrever um comando sed para substituir todos os códigos de cores para outra coisa?

    
por Ben 06.07.2015 / 19:14

1 resposta

1

Suposição: você está tentando isso através de um pipe.
OBSERVAÇÃO: cal imprime códigos de cores somente para tty .

Primeiro, se você for substituir o que cal envia pelo canal, será necessário verificar o que o cal envia para esse canal.

$ cal | od -t x1z -w$((($COLUMNS-12)/4))
0000000 20 20 20 20 20 4a 75 6c 69 20 32 30 31 35 20 20 20 20  >     Juli 2015    <
0000022 20 20 20 20 0a 73 c3 b6 20 6d c3 a5 20 74 69 20 6f 6e  >    .s.. m.. ti on<
0000044 20 74 6f 20 66 72 20 6c c3 b6 20 20 0a 20 20 20 20 20  > to fr l..  .     <
0000066 20 20 20 20 20 31 20 20 32 20 20 33 20 20 34 20 20 0a  >     1  2  3  4  .<
0000110 20 35 20 5f 08 20 5f 08 36 20 20 37 20 20 38 20 20 39  > 5 _. _.6  7  8  9<
0000132 20 31 30 20 31 31 20 20 0a 31 32 20 31 33 20 31 34 20  > 10 11  .12 13 14 <
0000154 31 35 20 31 36 20 31 37 20 31 38 20 20 0a 31 39 20 32  >15 16 17 18  .19 2<
0000176 30 20 32 31 20 32 32 20 32 33 20 32 34 20 32 35 20 20  >0 21 22 23 24 25  <
0000220 0a 32 36 20 32 37 20 32 38 20 32 39 20 33 30 20 33 31  >.26 27 28 29 30 31<
0000242 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  >     .            <
0000264 20 20 20 20 20 20 20 20 20 20 0a                       >          .<
0000277

Verificando os códigos hexadecimais (de od -t x1 ) acima, você vê a sequência de 35 20 5f 08 20 5f 08 36 20 20 37
onde 35 (primeiros dois caracteres) são iguais a 5 e o último 37 é o mesmo que 7 na saída real (e no dump ascii à direita).
Pouco antes de 37 você tem um par de 20 (espaços) e há um 36 que é do 6 .
Agora, apenas à esquerda do 36 , você vê o que precisa substituir: 5f 08 20 5f 08

$ cal | sed -re 's/\x5f\x08\x20\x5f\x086/<strong>6<\/strong>/'
     Juli 2015        
sö må ti on to fr lö  
          1  2  3  4  
 5 <strong>6</strong>  7  8  9 10 11  
12 13 14 15 16 17 18  
19 20 21 22 23 24 25  
26 27 28 29 30 31  

Lá vai você. Eu vou deixar a tarefa de fazer isso para você.

Uma dica adicional, verifique man 5 terminfo para que as coisas tentem com tput - isso se adaptará o máximo possível ao tipo de terminal disponível em tempo de execução.

Portanto, tput setb 6 definirá a cor de fundo 6, se o terminal for capaz disso. E da mesma forma, tput sgr0 redefinirá todas as configurações de cor para "normal".

E se você enviar a saída tput para, por exemplo, od -t x1z , você verá qual é a saída.

Resultado final: um script muito mais portátil do que um usando echo -e ...

    
por 06.07.2015 / 20:28