Remplacer "/ U + {4} /" par un caractère unicode approprié dans le pipeline shell avec le drapeau sed eval

J'essaie de visualiser correctement les caractères existants répertoriés dans le file /usr/include/X11/keysymdef.h .

Il a des lignes comme:

 #define XK_onethird 0x0ab0 /* U+2153 VULGAR FRACTION ONE THIRD */ #define XK_twothirds 0x0ab1 /* U+2154 VULGAR FRACTION TWO THIRDS */ #define XK_onefifth 0x0ab2 /* U+2155 VULGAR FRACTION ONE FIFTH */ 

Je voudrais les afficher comme:

 #define XK_onethird 0x0ab0 /* ⅓ VULGAR FRACTION ONE THIRD */ #define XK_twothirds 0x0ab1 /* ⅔ VULGAR FRACTION TWO THIRDS */ #define XK_onefifth 0x0ab2 /* ⅕ VULGAR FRACTION ONE FIFTH */ 

J'ai essayé:

 $ sed -e 's/U+\([0-9A-Fa-f]\{4\}\)/\u\1/' < /usr/include/X11/keysymdef.h 

Cela "ignore" le \u . Donc, le faire bouillir vers quelques testes sed avec le Pilgrow "¶":

 $ echo 00B6 | sed -re $'s/(....)/echo "\u00B6"/e' ¶ # Good, display works, lets get the capture group: $ echo 00B6 | sed -re $'s/(....)/echo "\u00B6 \\1"/e' ¶ 00B6 # So far, so good, lets prefix \u again: $ echo 00B6 | sed -re $'s/(....)/echo "\u00B6 \u\\1"/e' ¶ 00B6 # Huh? Ok, trying double-wrapping $ echo 00B6 | sed -re $'s/(....)/echo "\u00B6 \\u\\1"/e' ¶ 00B6 # Hey, where did the '\\u' go? Ok, try something else: $ echo 00B6 | sed -re $'s/(....)/echo $(echo "\u00B6 \u\\1")/e' ¶ 00B6 # I give up 

(Note: Je viens aussi d'essayer quelques variantes de ce qui précède avec printf . Pas de changement)

Qu'est-ce qui me manque? Pourquoi ne puis-je pas utiliser le drapeau d'évaluation de sed comme ça?

Edit: Je suis conscient que cela peut être travaillé avec while read echo eval et être résolu avec d'autres langues / outils, et apprécié (+ 1d) les réponses.

Pour cette question, cependant, je serais très intéressé par une solution avec sed ou savoir pourquoi les commands ci-dessus produisent cette sortie et / ou pourquoi ce n'est pas possible. Donc, @IporSircer et @Pasortingck ou d'autres, pourriez-vous bien vouloir postr / modifier les réponses pour inclure quelque chose par «sed eval echo» afin que je puisse en marquer une comme «la» réponse?

Avec perl:

 perl -CS -pe 's/\bU\+([\dA-Fa-f]{4})\b/chr(hex($1))/eg' /usr/include/X11/keysymdef.h 

Cela indique à perl de searchr U+0000 , de convertir le 0000 en hexadécimal, puis de le replace par le caractère représenté par ce numéro.

Si vous voulez replace le contenu du file, vous pouvez le faire:

 perl -i -CD -pe 's/\bU\+([\dA-Fa-f]{4})\b/chr(hex($1))/eg' /path/to/file 

Passez la sortie sed (modifiée) en ligne par echo -e "" :

 sed -e 's/U+\([0-9A-Fa-f]\{4\}\)/\\u\1/' </usr/include/X11/keysymdef.h | while read -r line;do echo -e "$line";done