파일에 나열된 기존 문자를 올바르게 시각화하려고 합니다 /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
또는 위 명령이 이 출력을 생성하는 이유 및/또는 이것이 불가능한 이유를 알아보세요.
답변1
펄 사용:
perl -CS -pe 's/\bU\+([\dA-Fa-f]{4})\b/chr(hex($1))/eg' /usr/include/X11/keysymdef.h
이는 Perl에게 를 찾아서 16진수로 U+0000
변환한 0000
다음 해당 숫자가 나타내는 문자로 바꾸도록 지시합니다.
파일 내용을 바꾸려면 다음과 같이 하세요.
perl -i -CD -pe 's/\bU\+([\dA-Fa-f]{4})\b/chr(hex($1))/eg' /path/to/file
답변2
(수정된) 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