십진수를 ASCII 문자로 인쇄하면 명령이 의도 한대로 출력되지 않습니다


14

다음 명령으로 모든 ASCII 문자의 문자열을 출력하고 싶었습니다.

for i in `seq 32 127`; do printf "%c" $i; done

위 명령의 출력은 다음과 같습니다.

33333334444444444555555555566666666667777777777..............

각 숫자의 첫 번째 (왼쪽부터) 숫자입니다.

이 사이트를 통해 문제에 대한 답을 찾았습니다. CLI에서 인쇄 가능한 모든 ASCII 문자를 인쇄하는 방법은 무엇입니까? 그러나 원본 스 니펫이 왜 ASCII 문자를 의도 한대로 출력하지 않는지 이해가되지 않습니다.


1
POSIX 는 이것을 지시합니다. 여기 그것이 왜 comp.unix.shell;)
옳은지

@sr_ 스레드를 지적 해 주셔서 감사합니다. 내가 찾고있는 설명이있었습니다.
Ifthikhan

답변:


13

를 사용하여 ASCII 코드를 직접 인쇄 할 수 없습니다 printf "%c" $iC에서 등 .

먼저 i의 10 진수 값을 8 진수 값으로 변환 한 다음 다음을 사용하여 인쇄해야합니다.printf\ 각각의 8 진수 값을 앞에 배치 합니다.

인쇄하려면 A10 진수 65를 8 진수 즉 101로 변환 한 다음 8 진수 값을 다음과 같이 인쇄해야합니다.

printf "\101\n"

인쇄 A됩니다.

따라서 다음과 같이 수정해야합니다.

for i in `seq 32 127`; do printf \\$(printf "%o" $i);done;

그러나 awkC 언어 에서처럼 직접 인쇄 할 수 있습니다.

awk 'BEGIN{for(i=32;i<=127;i++)printf "%c",i}';echo

7
에서 bashzsh이 루프없이 외부 명령없이 수행 할 수 있습니다 printf $(printf '\%o' {32..127}).
manatwork

@manatwork : 나중에 정확히 .. 지적 해
주셔서 감사

1
@pradeepchhetri : 자세한 답변 감사합니다. 필요한 세부 사항 대부분을 다루는 것처럼 보였습니다 (따라서 답변을 선택하십시오). 그러나 나는 unix.derkeiler.com/Newsgroups/comp.unix.shell/2007-07/… 의 다음 메시지에서 찾을 수있는 중요한 정보를 놓친 것 같습니다 . "대응하는 변환 지정자가 b, c 또는 s 인 경우 인수 피연산자는 문자열로 처리됩니다 ..."
Ifthikhan

(char)(127)백 스페이스 나 그와 비슷한 것이 아닙니다 . 그것이 무엇이든, 그것은 16 진수 상자 중 하나 또는 그들이 부르는 것으로 나타납니다. "인쇄 가능"(즉, 읽을 수있는) 만 원한다면 126으로 이동하십시오. 또한 8 진법에 대해서도 잘 생각해보십시오. 그것은 영리합니다. 나는 16 진법으로 생각하고 있었지만 ( printf '\x%x; {32..126}... 또는 127 과 같이 , 당신도 그렇게 했으므로 추측하지 않습니다) 작동하지 않습니다. 옥탈은 하루를 저장합니다! :) 마지막으로 @Ifthikhan, 나는 당신이 무슨 뜻인지 잘 모르겠습니다. awk종종 C 스타일 명령을 사용하고 다른 곳에서는 %c사용 되지 않습니다 . 8 진수를 사용하는 것은 1 바이트 문자를 사용하는 것과 다릅니다.
Dylan

3

%c 연관된 인수를 char로 해석합니다. 주어진 인수의 첫 문자 만 인쇄됩니다.

이미 인쇄 방법이있는 것 같지만 여기에 한 가지 변형이 있습니다.

for i in `seq 32 127`; do printf "\x$(printf "%x" $i) $i"; done

0

필요 printf하지만 한 번만; printf더 간단하고 효율적인 echo플러스 Bash 이스케이프 시퀀스로 한 번의 사용을 대체 할 수 있습니다 .

16 진법으로 :

for i in `seq 32 127`; do
  echo -ne \\x$(printf %02x $i)
done

8 진법 :

for i in `seq 32 127`; do
  echo -ne \\0$(printf %03o $i)
done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.