Valor ASCII entero para el carácter en BASH usando printf

Carácter para valorar trabajos:

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

Tengo dos preguntas, la primera es la más importante:

  • ¿Cómo tomo 65 y lo convierto en A?
  • \ ‘A convierte un caracter ASCII a su valor usando printf. ¿Es la syntax específica para printf o se usa en otro lugar en BASH? (Esas cadenas pequeñas son difíciles de buscar para Google).

Una línea

 printf "\x$(printf %x 65)" 

Dos lineas

 set $(printf %x 65) printf "\x$1" 

Aquí hay uno si no te importa usar awk

 awk 'BEGIN{printf "%c", 65}' 

Esto funciona (con el valor en octal):

 $ printf '%b' '\101' A 

incluso para (algunas: no pases 7) secuencias:

 $ printf '%b' '\'{101..107} ABCDEFG 

Una construcción general que permite valores (decimales) en cualquier rango es:

 $ printf '%b' $(printf '\\%03o' {65..122}) ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz 

O podrías usar los valores hexadecimales de los personajes:

 $ printf '%b' $(printf '\\x%x' {65..122}) ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz 

También puede recuperar el carácter con xxd (use valores hexadecimales):

 $ echo "41" | xxd -p -r A 

Es decir, una acción es la inversa de la otra:

 $ printf "%x" "'A" | xxd -p -r A 

Y también funciona con varios valores hexadecimales a la vez:

 $ echo "41 42 43 44 45 46 47 48 49 4a" | xxd -p -r ABCDEFGHIJ 

o secuencias (printf se usa aquí para obtener valores hexadecimales):

 $ printf '%x' {65..90} | xxd -r -p ABCDEFGHIJKLMNOPQRSTUVWXYZ 

O incluso usa awk:

 $ echo 65 | awk '{printf("%c",$1)}' A 

incluso para secuencias:

 $ seq 65 90 | awk '{printf("%c",$1)}' ABCDEFGHIJKLMNOPQRSTUVWXYZ 

Para este tipo de conversión, uso perl:

 perl -e 'printf "%c\n", 65;' 

Para su segunda pregunta, parece que la syntax de la cita inicial ( \'A ) es específica de printf :

Si el carácter inicial es una comilla simple o una comilla doble, el valor será el valor numérico en el conjunto de códigos subyacente del carácter que sigue la comilla simple o la comilla doble.

De http://pubs.opengroup.org/onlinepubs/009695399/utilities/printf.html

Una opción es ingresar directamente el carácter que te interesa utilizando la notación hexadecimal o octal:

 printf "\x41\n" printf "\101\n" 

Si desea guardar el valor ASCII del carácter: (Hice esto en BASH y funcionó)

 { char="A" testing=$( printf "%d" "'${char}" ) echo $testing} 

salida: 65

Aquí hay otra forma de convertir 65 en A (vía 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)" 

Para buscar en man bash para \' uso (aunque inútil en este caso):

 man bash | less -Ip "\\\'" # press  to go through the matches 

Si convierte 65 a hexadecimal, es 0x41 :

$ echo -e "\x41" A