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

가치있는 성격의 작품 :

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

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

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



답변

한 줄

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

두 줄

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

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

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


답변

이것은 작동합니다 (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


답변

두 번째 질문에 대해 선행 인용 구문 ( \'A)은 다음과 관련된 것 printf같습니다.

선행 문자가 작은 따옴표 또는 큰 따옴표 인 경우 값은 작은 따옴표 또는 큰 따옴표 다음에 오는 문자의 기본 코드 집합에있는 숫자 값이어야합니다.

에서 http://pubs.opengroup.org/onlinepubs/009695399/utilities/printf.html


답변

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

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


답변

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

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


답변

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

{
char="A"

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

echo $testing}

출력 : 65


답변

6516 진수 로 변환하면 다음과 0x41같습니다.

$ echo -e "\x41"
A