2014-11-26 2 views
0
그래서이 출력 지금

사용하여 유니 코드 문자로 숫자를 배쉬-교체 나오지

011010 

내가 파이프를 원하는 및 유니 코드 문자로 0과 1을 대체 할 sed를 사용, 그래서 유니 코드를 얻을 수의 printf에서 생성 한

바이너리 (011010) 대신 문자가 인쇄됩니다. 나는이 작업을 수행 할 수

은 문자 자체를 붙여 - 복사,하지만 난 대신 유니 코드 테이블에서 발견 된 것과 같은 값을 사용하려면 :

Position: 0x2701 
    Decimal: 9985 
    Symbol: ✁ 

가 어떻게이를 생성하는 SED와 위의 값을 사용합니까 캐릭터? (버전 4.2 이후)의 bash 나 zsh을 가진

+0

'유니 코드 문자를 이해하지 못하는 sed', 그것은 바이트를 이해 : 그럼 당신은 당신이 유니 코드 코드 포인트에 해당하는 UTF-8 시퀀스를 알고 가정, UTF-8 변환 작업을 수행 할 수 있습니다 Sub in U + 2701. 당신은 U + 2701의 UTF-8 인코딩으로 하위화할 수 있지만'sed'에 관한 한'\ xE2','\ x9c','\ x81'의 3 바이트입니다. (그리고 출력물이 UTF-8로 해석되지 않는 한 실제로 U + 2701 문자가되지는 않습니다.) – abarnert

+0

위와 같은 시도를했지만 어떤 이유로 작동하지 않습니다. sed/s/1/\ xE2 \ x9c \ x81/g이면 작동하지 않습니다. –

답변

5

는 간단한 해결책은 \u 이스케이프 포함 기약 C를 이해하는 $'...' 구문을 사용하는 것입니다

$ echo 011010 | sed $'s/1/\u2701/g' 
0✁✁0✁0 

당신이은 GNU가 나오지 않은 경우, 당신은 탈출을 사용할 수 있습니다 시퀀스는 s// 명령에 있습니다. Gnu sed은 불행히도 \u 유니 코드 이스케이프를 이해하지 못하지만 \x 16 진수 이스케이프를 이해합니다. 그러나 해독 할 수 있도록하려면 백 슬래시가 있는지 확인해야합니다. 그래서 당신은 할 수없는,

$ # Quote the argument 
$ echo 011010 | sed 's/1/\xE2\x9C\x81/g' 
0✁✁0✁0 
$ # Or escape the backslashes 
$ echo 011010 | sed s/1/\\xE2\\x9C\\x81/g 
0✁✁0✁0 
$ # This doesn't work because the \ is removed by bash before sed sees it 
$ echo 011010 | sed s/1/\xE2\x9C\x81/g 
0xE2x9Cx81xE2x9Cx810xE2x9Cx810 
$ # So that was the same as: sed s/1/xE2x9Cx81/g 
+1

다른'sed' 방언이 있습니다; 그들 모두가'\ xAF'도 도망 치는 것을 이해하지 못합니다. 휴대용 대안은'perl -pCSD -e 's/1/\ x {2701}/g' '일 수 있습니다. – tripleee

+0

@ tripleee : 그건 사실이야. bash $ '...'솔루션이 확실히 우수합니다. – rici

+0

답변입니다. 심지어 printf에서도 작동했습니다. 대단히 감사합니다 @rici –

관련 문제