printf를 사용하여 BASH의 문자에 대한 정수 ASCII 값


84

가치있는 성격의 작품 :

$ printf "%d\n" \'A
65
$ 

두 가지 질문이 있습니다. 첫 번째 질문이 가장 중요합니다.

  • 65를 어떻게 A로 바꾸나요?
  • \ 'A는 printf를 사용하여 ASCII 문자를 그 값으로 변환합니다. 구문 이 printf에 고유 합니까 아니면 BASH의 다른 곳에서 사용됩니까? (이러한 작은 문자열은 Google이 찾기 어렵습니다.)
bash  ascii  printf 

Windows에서는 ALT + 65를 사용하여 ASCII 문자를 인쇄합니다. 불행히도 Unix / bash를 사용하면 작동하지 않습니다.)
schnaader

2
@schnaader이지만 스크립트는 할 수 없습니다.
ctrl-alt-delor

2
@richard : Errr .. 쉽지도 실용적이지는 않지만 :) "그냥"Windows 또는 MS-DOS를 실행하는 VM을 시작하고 "echo", ALT, 6, 5, "> mysharedfolder \ file.txt"를 다음과 같이 보냅니다. 키를 입력하고 VM 공유 폴더에서 file.txt를 읽습니다.
schnaader

2
@schnaader 와인을 사용하여 그렇게 할 수 있습니까?
emory

답변:


69

한 줄

printf "\x$(printf %x 65)"

두 줄

set $(printf %x 65)
printf "\x$1"

당신이 사용하는 것을 좋아하지 않는다면 여기에 하나가 있습니다. awk

awk 'BEGIN{printf "%c", 65}'

3
잘 작동해야합니다printf "$(printf '\\x%02x' $char)"
0andriy

31

이것은 작동합니다 (8 진수 값으로) :

$ printf '%b' '\101'
A

심지어 (일부 : 7 개를 넘지 마십시오) 시퀀스 :

$ printf '%b' '\'{101..107}
ABCDEFG

모든 범위에서 (십진수) 값을 허용하는 일반적인 구조는 다음과 같습니다.

$ printf '%b' $(printf '\\%03o' {65..122})
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz

또는 문자의 16 진수 값을 사용할 수 있습니다.

$ printf '%b' $(printf '\\x%x' {65..122})
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz

xxd (16 진수 값 사용)를 사용하여 문자를 다시 가져올 수도 있습니다.

$ echo "41" | xxd -p -r
A

즉, 한 작업은 다른 작업의 반대입니다.

$ printf "%x" "'A" | xxd -p -r
A

또한 한 번에 여러 16 진수 값으로 작동합니다.

$ echo "41 42 43 44 45 46 47 48 49 4a" | xxd -p -r
ABCDEFGHIJ

또는 시퀀스 (여기에서는 16 진수 값을 얻기 위해 printf가 사용됨) :

$ printf '%x' {65..90} | xxd -r -p 
ABCDEFGHIJKLMNOPQRSTUVWXYZ

또는 awk를 사용하십시오.

$ echo 65 | awk '{printf("%c",$1)}'
A

시퀀스의 경우에도 :

$ seq 65 90 | awk '{printf("%c",$1)}'
ABCDEFGHIJKLMNOPQRSTUVWXYZ


9

한 가지 옵션은 16 진수 또는 8 진수 표기법을 사용하여 관심있는 문자를 직접 입력하는 것입니다.

printf "\x41\n"
printf "\101\n"

8

이런 종류의 변환에는 perl을 사용합니다.

perl -e 'printf "%c\n", 65;'

2
또는 perl에서 chr (65), "\ n"을 인쇄하십시오. 이 작업을 많이 수행하는 경우 perl이 좋은 선택 일 수 있지만 쉘의 printf를 사용하여 번호를 \ 0 이스케이프 시퀀스로 이동할 수있는 것으로 변환하면 잘 작동합니다. printf에서 \ u 지원이 필요하므로 유니 코드를 사용하면 더 복잡합니다.
Peter Cordes 2013

불행히도 Perl은 잊혀진 언어입니다. 이제 거의 모든 Linux 시스템에있는 Python이 더 좋습니다. 또한 질문은 다른 플랫폼이 아닌 Shell-Bash에 관한 것입니다!
s3n0

7

문자의 ASCII 값을 저장하려면 : (BASH에서이 작업을 수행했고 작동했습니다)

{
char="A"

testing=$( printf "%d" "'${char}" )

echo $testing}

출력 : 65


감사합니다. 입력 한 문자에서 정수 (ASCII 코드)를 얻고 싶었습니다. 나는 스크립트를 만들었다 : {read -n 1 c; echo $ (printf "% d" " '$ {c}")}
Phaedrus


3

다음은 65를 A로 변환하는 또 다른 방법입니다 (8 진수를 통해).

help printf  # in Bash
man bash | less -Ip '^[[:blank:]]*printf'

printf "%d\n" '"A'
printf "%d\n" "'A"

printf '%b\n' "$(printf '\%03o' 65)"

에서 검색하기 man bash위해 \'(이 경우 무의미하지만) 사용 :

man bash | less -Ip "\\\'"  # press <n> to go through the matches

3

대문자의 경우 :

i=67
letters=({A..Z})
echo "${letters[$i-65]}"

산출:


1

이것은 기본 bash 설정의 모든 "인쇄 가능한"문자를 인쇄합니다.

printf '%b\n' $(printf '\\%03o' {30..127})

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.