web-dev-qa-db-fra.com

Entier ASCII valeur en caractère dans BASH à l'aide de printf

Caractère à valeur fonctionne:

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

J'ai deux questions, la première est la plus importante:

  • Comment puis-je prendre 65 et le transformer en A?
  • \ 'A convertit un caractère ASCII en sa valeur en utilisant printf. La syntaxe est-elle spécifique à printf ou est-elle utilisée ailleurs dans BASH? (De telles petites chaînes sont difficiles à rechercher sur Google.)
70
user14070

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}'
56
broaden

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
22
user2350426

Pour ce type de conversion, j'utilise Perl:

Perl -e 'printf "%c\n", 65;'
9
mouviciel

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

8
David Hu

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"
8
Naaff

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

7
MagicMercury86

Si vous convertissez 65 en hexadécimal c'est 0x41:

$ echo -e "\x41" A

4
Cyber Oliveira

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
3
chand

Pour les lettres majuscules:

i=67
letters=({A..Z})
echo "${letters[$i-65]}"

Sortie:

 C 
0
Cyrus