Text-Processing

替換“/U+0-9A-Fa-f0−9一種−F一種−F0-9A-Fa-f{4}/’ 在帶有 sed eval 標誌的 shell 管道中具有正確的 unicode 字元

  • March 29, 2020

我正在嘗試正確視覺化/usr/include/X11/keysymdef.h文件中列出的現有字元。

它有如下幾行:

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

我想像這樣顯示它們:

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

我試過:

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

那隻是“忽略” \u. 因此,sed使用 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

(注意:我剛剛也嘗試了上面的一些變體printf。沒有變化)

我錯過了什麼?為什麼我不能使用這樣的評估標誌sed

編輯:我知道,這可以while read echo eval使用其他語言/工具解決和解決,並讚賞(+1d)答案。

但是,對於這個問題,我最感興趣的解決方案是sed或知道為什麼上述命令會產生此輸出和/或為什麼不可能。

使用 perl:

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

這告訴 perl 查找U+0000,將 轉換0000為十六進制,然後用該數字表示的字元替換它。

如果要替換文件的內容,可以執行以下操作:

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

將(修改後的)sed 輸出逐行傳遞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 

引用自:https://unix.stackexchange.com/questions/324754