Integer ASCII value to character in BASH using printf
This works (with the value in octal):
$ printf '%b' '\101'A
even for (some: don't go over 7) sequences:
$ printf '%b' '\'{101..107}ABCDEFG
A general construct that allows (decimal) values in any range is:
$ printf '%b' $(printf '\\%03o' {65..122})ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz
Or you could use the hex values of the characters:
$ printf '%b' $(printf '\\x%x' {65..122})ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz
You also could get the character back with xxd (use hexadecimal values):
$ echo "41" | xxd -p -rA
That is, one action is the reverse of the other:
$ printf "%x" "'A" | xxd -p -rA
And also works with several hex values at once:
$ echo "41 42 43 44 45 46 47 48 49 4a" | xxd -p -rABCDEFGHIJ
or sequences (printf is used here to get hex values):
$ printf '%x' {65..90} | xxd -r -p ABCDEFGHIJKLMNOPQRSTUVWXYZ
Or even use awk:
$ echo 65 | awk '{printf("%c",$1)}'A
even for sequences:
$ seq 65 90 | awk '{printf("%c",$1)}'ABCDEFGHIJKLMNOPQRSTUVWXYZ
For your second question, it seems the leading-quote syntax (\'A
) is specific to printf
:
If the leading character is a single-quote or double-quote, the value shall be the numeric value in the underlying codeset of the character following the single-quote or double-quote.
From https://pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html