Text-Processing
替換“/U+0-9A-Fa-f0−9一種−F一種−F0-9A-Fa-f{4}/’ 在帶有 sed eval 標誌的 shell 管道中具有正確的 unicode 字元
我正在嘗試正確視覺化
/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