Quería generar una cadena de todos los caracteres ascii con el siguiente comando
for i in `seq 32 127`; do printf "%c" $i; done
La salida del comando anterior es:
33333334444444444555555555566666666667777777777..............
Es el primer dígito (desde la izquierda) de cada número.
Al examinar este sitio, encontré la respuesta a mi problema. ¿Cómo imprimir todos los caracteres ASCII imprimibles en la CLI? , sin embargo, todavía no entiendo por qué mi fragmento original no muestra los caracteres ascii como se esperaba.
bash
shell
character-encoding
ascii
Ifthikhan
fuente
fuente
comp.unix.shell
hilo sobre por qué es lo correcto;)
Respuestas:
No puede imprimir directamente los códigos ASCII utilizando los
printf "%c" $i
similares en C.Primero debe convertir el valor decimal de i en su valor octal y luego debe imprimirlo usando
printf
y poniendo\
delante de sus respectivos valores octales.Para imprimir
A
, debe convertir el decimal 65 en octal, es decir, 101, y luego debe imprimir ese valor octal como:Esto se imprimirá
A
.Entonces tienes que modificarlo para:
Pero al usarlo
awk
puedes imprimir directamente como en lenguaje Cfuente
bash
yzsh
esto se puede hacer sin el bucle y sin el comando externo:printf $(printf '\%o' {32..127})
.(char)(127)
retroceso o algo así. Sea lo que sea, aparece como una de las cajas hexadecimales o como se llamen. Si solo desea lo "imprimible" (es decir, legible), simplemente vaya a 126. Además, un buen pensamiento con el octal. Eso es inteligente; Estaba pensando en términos de hexadecimal (comoprintf '\x%x; {32..126}
... o 127, supongo, ya que todos ustedes también lo hicieron), pero no funciona. ¡Octal salva el día! :) Finalmente, @ Ifthikhan, no estoy seguro de lo que quieres decir.awk
a menudo usa comandos de estilo C y no se%c
usa ningún otro lugar . Usar números octales es diferente a usar caracteres de un byte.%c
Interpreta el argumento asociado como char: solo se imprime el primer carácter de un argumento dadoParece que ya tiene una forma de imprimirlos, pero aquí hay una variante.
fuente
Necesitas
printf
, pero solo una vez; puede reemplazar un uso deprintf
por lasecho
secuencias de escape Bash más simples y más eficientes :Con hexagesimales:
Con los octales:
fuente