Substitua “/ U + [0-9A-Fa-f] {4} /” pelo caractere unicode apropriado no pipeline de shell com a flag sed eval

4

Estou tentando visualizar adequadamente os caracteres existentes listados no arquivo /usr/include/X11/keysymdef.h .

Tem linhas como:

#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 */

Eu gostaria de exibi-los como:

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

Eu tentei:

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

Isso apenas "ignora" o \u . Então, fervendo para alguns sed testcases com o Pilcrow "¶":

$ 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

(Nota: eu também agora tentei algumas variações dos itens acima com printf . Nenhuma alteração)

O que estou perdendo? Por que não consigo usar o sinalizador de avaliação de sed assim?

Edit: Estou ciente de que isso pode ser trabalhado com while read echo eval e ser resolvido com outras linguagens / ferramentas, e apreciei (+ 1d) as respostas.

Para esta questão, no entanto, eu estaria mais interessado em uma solução com sed ou saber por que os comandos acima produzem esta saída e / ou porque não é possível. Então, @IporSircer e @Patrick ou outros, você poderia gentilmente postar / alterar as respostas para incluir algo que não seja. "sed eval echo" para que eu possa marcar um como "a" resposta?

    
por Alex Stragies 20.11.2016 / 19:28

2 respostas

4

Com perl:

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

Isto diz ao perl para procurar por U+0000 , converter o 0000 para hexadecimal e depois substituí-lo pelo caractere representado por esse número.

Se você quiser substituir o conteúdo do arquivo, faça o seguinte:

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

Transmita a saída da linha sed (modificada) por meio de echo -e "" :

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