sed eval 플래그를 사용하여 "/U+[0-9A-Fa-f]{4}/"를 셸 파이프라인의 올바른 유니코드 문자로 바꿉니다.

sed eval 플래그를 사용하여 "/U+[0-9A-Fa-f]{4}/"를 셸 파이프라인의 올바른 유니코드 문자로 바꿉니다.

파일에 나열된 기존 문자를 올바르게 시각화하려고 합니다 /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. 그러니 좀 끓이세요.sedPilcrow "¶"를 사용한 테스트 케이스:

$ 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 

관련 정보