Carácter para valorar obras:
$ 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 carácter ASCII a su valor usando printf. ¿La sintaxis es específica de printf o se usa en cualquier otro lugar de BASH? (Estas cadenas pequeñas son difíciles para Google).
Respuestas:
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}'
fuente
printf "$(printf '\\x%02x' $char)"
Esto funciona (con el valor en octal):
$ printf '%b' '\101' A
incluso para (algunos: no pases de 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 puede usar los valores hexadecimales de los caracteres:
$ 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
fuente
Para su segunda pregunta, parece que la sintaxis de comillas iniciales (
\'A
) es específica deprintf
:De http://pubs.opengroup.org/onlinepubs/009695399/utilities/printf.html
fuente
Una opción es ingresar directamente el carácter que le interesa usando notación hexadecimal u octal:
printf "\x41\n" printf "\101\n"
fuente
Para este tipo de conversión, uso perl:
perl -e 'printf "%c\n", 65;'
fuente
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
fuente
Si convierte
65
a hexadecimal es0x41
:$ echo -e "\x41" A
fuente
$ printf "\x41"
Aquí hay otra forma de convertir 65 en A (a través de 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
man bash
para su\'
uso (aunque inútil en este caso):man bash | less -Ip "\\\'" # press <n> to go through the matches
fuente
Para letras mayúsculas:
i=67 letters=({A..Z}) echo "${letters[$i-65]}"
Salida:
fuente
esto imprime todos los caracteres "imprimibles" de su configuración básica de bash:
printf '%b\n' $(printf '\\%03o' {30..127}) !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
fuente