97

文字から値への動作:

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

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

  • 65 を A に変換するにはどうすればよいですか?
  • \'A は、printf を使用して ASCII 文字をその値に変換します。構文はprintfに固有ものですか、それともBASHの他の場所で使用されていますか? (このような小さな文字列は、Google で検索するのが困難です。)
4

13 に答える 13

78

1行

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

2行

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

使用してもかまわない場合はこちらawk

awk 'BEGIN{printf "%c", 65}'
于 2009-11-18T10:10:40.580 に答える
39

これは機能します(値は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

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

$ 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
于 2015-09-22T23:16:10.490 に答える
17

2 番目の質問については、先頭の引用符の構文 ( \'A) は に固有のようprintfです:

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

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.htmlから

于 2011-12-01T09:43:53.000 に答える
10

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

printf "\x41\n"
printf "\101\n"
于 2009-05-20T21:21:32.667 に答える
8

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

perl -e 'printf "%c\n", 65;'
于 2009-05-20T21:12:31.887 に答える
7

文字のASCII値を保存したい場合:(私はこれをBASHで行いましたが、うまくいきました)

{
char="A"

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

echo $testing}

出力: 65

于 2012-02-21T22:49:58.120 に答える
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
于 2014-11-20T10:05:08.783 に答える