価値を生むキャラクター:
$ printf "%d\n" \'A
65
$
2つの質問がありますが、最初の質問が最も重要です。
一行
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
つまり、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
この種の変換には、Perlを使用します。
Perl -e 'printf "%c\n", 65;'
2番目の質問では、先行引用符構文(\'A
)はprintf
に固有です:
先行文字が単一引用符または二重引用符である場合、値は、単一引用符または二重引用符に続く文字の基になるコードセットの数値でなければなりません。
から http://pubs.opengroup.org/onlinepubs/009695399/utilities/printf.html
1つのオプションは、16進表記または8進表記を使用して、関心のある文字を直接入力することです。
printf "\x41\n"
printf "\101\n"
ASCII文字の値を保存したい場合:(これをBASHで実行し、動作しました)
{
char="A"
testing=$( printf "%d" "'${char}" )
echo $testing}
出力:65
65
を16進数に変換すると、0x41
になります。
$ echo -e "\x41" A
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
大文字の場合:
i=67
letters=({A..Z})
echo "${letters[$i-65]}"
出力:
C