web-dev-qa-db-ja.com

整数ASCII printfを使用したBASHの文字の値

価値を生むキャラクター:

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

2つの質問がありますが、最初の質問が最も重要です。

  • 65を取得してAにするにはどうすればよいですか?
  • \ 'Aは、printfを使用してASCII文字をその値に変換します。構文はspecifictoprintfまたはBASHの他の場所で使用されていますか?(このような小さな文字列はGoogleにとって困難です。)
70
user14070

一行

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

2行

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

awkを使用しても構いません

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

これは機能します(値は8進数で):

$ printf '%b' '\101'
A

(一部:7を超えない)シーケンスでも:

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

任意の範囲の(10進数)値を許可する一般的な構成は次のとおりです。

$ 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

つまり、1つのアクションは他のアクションの逆です。

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

また、一度に複数の16進値で動作します。

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

またはシーケンス(printfは16進値を取得するためにここで使用されます):

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

またはawkを使用することもできます。

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

シーケンスでも:

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

この種の変換には、Perlを使用します。

Perl -e 'printf "%c\n", 65;'
9
mouviciel

2番目の質問では、先行引用符構文(\'A)はprintfに固有です:

先行文字が単一引用符または二重引用符である場合、値は、単一引用符または二重引用符に続く文字の基になるコードセットの数値でなければなりません。

から http://pubs.opengroup.org/onlinepubs/009695399/utilities/printf.html

8
David Hu

1つのオプションは、16進表記または8進表記を使用して、関心のある文字を直接入力することです。

printf "\x41\n"
printf "\101\n"
8
Naaff

ASCII文字の値を保存したい場合:(これをBASHで実行し、動作しました)

{
char="A"

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

echo $testing}

出力:65

7
MagicMercury86

65を16進数に変換すると、0x41になります。

$ echo -e "\x41" A

4
Cyber Oliveira

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
chand

大文字の場合:

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

出力:

 C 
0
Cyrus