Remplacer les caractères en surbrillance par autre chose

0

Je souhaite remplacer les codes de couleur par autre chose. Par exemple, en cours d'exécution cal commande je veux obtenir des balises HTML au lieu de codes de couleur:

     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 

L'exécution echo -e "\e[0;36m\e[41m some text" vous donnera le bleu sur fond rouge. Suivant le même exemple, je peux trouver le code hexadécimal de cette couleur:

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

lequel est 5b1b 3b30 3633 1b6d 345b 6d31 000a . Comment puis-je écrire un sed commande pour remplacer tous les codes de couleur à autre chose?

Ben
la source

Réponses:

1

Assomption: Vous essayez ceci via un tuyau.
REMARQUE: cal imprime les codes de couleur seulement vers un tty.

D'abord si vous allez remplacer quoi cal envoie par le tuyau, alors vous devez vérifier quoi cal envoie dans ce tuyau.

$ 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

Vérification des codes hexadécimaux (de od -t x1 ) au dessus tu vois la séquence
35 20 5f 08 20 5f 08 36 20 20 37
35 (les deux premiers caractères) sont identiques à 5 et le dernier 37 est le même que 7 dans la sortie réelle (et dans le vidage ascii à droite).
Juste avant 37 vous avez quelques 20 (espaces) et il y a un 36 qui est de la 6.
Maintenant juste à gauche de la 36 vous voyez ce que vous devez remplacer: 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  

Voilà.
Je vous laisserai le soin de vous donner ce général.


Un conseil supplémentaire, vérifiez man 5 terminfo pour les choses à essayer avec tput - Cela s'adaptera autant que possible au type de terminal disponible lors de l'exécution.

Alors tput setb 6 définira la couleur d'arrière-plan 6, si le terminal en est capable. Et également tput sgr0 réinitialisera tous les paramètres de couleur sur "normal".

Et si vous dirigez la sortie tput dans, par exemple, od -t x1z vous verrez quelle est la sortie.

Résultat final: un script beaucoup plus portable que celui utilisant echo -e ...

Hannu
la source
Il a été amélioré pour remplacer les groupes "sed -re" / \ x5f \ x08 \ x20 \ x5f \ x086 ([0-9] *) / "strong", mais ce serait remplacez uniquement un arrière-plan et une variation de couleur, pour correspondre à toute couleur + arrière-plan dont j'ai besoin pour apprendre la structure de ce code. Merci pour une bonne réponse, vous d un vrai MVP
Ben
1
Remarque: \x08 est le retour arrière, le suivant 6 est le '6' que vous avez ci-dessus. je suggère \x08([0-9]{1,2}) pour commencer; c'est-à-dire un ou deux chiffres.
Hannu