文字から値への動作:
$ printf "%d\n" \'A
65
$
2 つの質問があります。最初の質問が最も重要です。
- 65 を A に変換するにはどうすればよいですか?
- \'A は、printf を使用して ASCII 文字をその値に変換します。構文はprintfに固有のものですか、それともBASHの他の場所で使用されていますか? (このような小さな文字列は、Google で検索するのが困難です。)
1行
printf "\x$(printf %x 65)"
2行
set $(printf %x 65)
printf "\x$1"
使用してもかまわない場合はこちらawk
awk 'BEGIN{printf "%c", 65}'
これは機能します(値は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
2 番目の質問については、先頭の引用符の構文 ( \'A
) は に固有のようprintf
です:
先頭の文字が一重引用符または二重引用符である場合、値は、一重引用符または二重引用符に続く文字の基になるコードセットの数値でなければなりません。
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.htmlから
1 つのオプションは、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
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