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