Caractère à valeur fonctionne:
$ printf "%d\n" \'A
65
$
J'ai deux questions, la première est la plus importante:
Une ligne
printf "\x$(printf %x 65)"
Deux lignes
set $(printf %x 65)
printf "\x$1"
En voici un si cela ne vous dérange pas d'utiliser awk
awk 'BEGIN{printf "%c", 65}'
Cela fonctionne (avec la valeur en octal):
$ printf '%b' '\101'
A
même pour (certains: ne pas dépasser 7) séquences:
$ printf '%b' '\'{101..107}
ABCDEFG
Une construction générale qui autorise les valeurs (décimales) dans n'importe quelle plage est la suivante:
$ printf '%b' $(printf '\\%03o' {65..122})
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz
Ou vous pouvez utiliser les valeurs hexadécimales des caractères:
$ printf '%b' $(printf '\\x%x' {65..122})
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz
Vous pouvez également récupérer le caractère avec xxd (utilisez des valeurs hexadécimales):
$ echo "41" | xxd -p -r
A
C'est-à-dire qu'une action est l'inverse de l'autre:
$ printf "%x" "'A" | xxd -p -r
A
Et fonctionne également avec plusieurs valeurs hexadécimales à la fois:
$ echo "41 42 43 44 45 46 47 48 49 4a" | xxd -p -r
ABCDEFGHIJ
ou des séquences (printf est utilisé ici pour obtenir des valeurs hexadécimales):
$ printf '%x' {65..90} | xxd -r -p
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Ou même utiliser awk:
$ echo 65 | awk '{printf("%c",$1)}'
A
même pour les séquences:
$ seq 65 90 | awk '{printf("%c",$1)}'
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Pour ce type de conversion, j'utilise Perl:
Perl -e 'printf "%c\n", 65;'
Pour votre deuxième question, il semble que la syntaxe de la citation principale (\'A
) est spécifique à printf
:
Si le caractère principal est une simple citation ou une double citation, la valeur doit être la valeur numérique du jeu de codes sous-jacent du caractère suivant la citation simple ou la double citation.
De http://pubs.opengroup.org/onlinepubs/009695399/utilities/printf.html
Une option consiste à saisir directement le caractère qui vous intéresse en utilisant la notation hexadécimale ou octale:
printf "\x41\n"
printf "\101\n"
Si vous voulez sauvegarder le ASCII du caractère: (je l'ai fait dans BASH et cela a fonctionné)
{
char="A"
testing=$( printf "%d" "'${char}" )
echo $testing}
sortie: 65
Si vous convertissez 65
en hexadécimal c'est 0x41
:
$ echo -e "\x41" A
Voici encore un autre moyen de convertir 65 en A (via octal):
help printf # in Bash
man bash | less -Ip '^[[:blank:]]*printf'
printf "%d\n" '"A'
printf "%d\n" "'A"
printf '%b\n' "$(printf '\%03o' 65)"
Pour rechercher dans man bash
pour \'
usage (bien que futile dans ce cas):
man bash | less -Ip "\\\'" # press <n> to go through the matches
Pour les lettres majuscules:
i=67
letters=({A..Z})
echo "${letters[$i-65]}"
Sortie:
C