Je voulais sortir une chaîne de tous les caractères ascii avec la commande suivante
for i in `seq 32 127`; do printf "%c" $i; done
La sortie de la commande ci-dessus est:
33333334444444444555555555566666666667777777777..............
C'est le premier chiffre (à partir de la gauche) de chaque numéro.
En parcourant ce site, je suis tombé sur la réponse à mon problème Comment imprimer tous les caractères ASCII imprimables en CLI? , mais je ne comprends toujours pas pourquoi mon extrait d'origine ne génère pas les caractères ascii comme prévu.
bash
shell
character-encoding
ascii
Ifthikhan
la source
la source
comp.unix.shell
fil sur pourquoi c'est la bonne chose;)
Réponses:
Vous ne pouvez pas imprimer directement les codes ascii en utilisant le
printf "%c" $i
même en C.Vous devez d'abord convertir la valeur décimale de i en sa valeur octale , puis l'imprimer en utilisant
printf
et en plaçant\
devant leurs valeurs octales respectives.Pour imprimer
A
, vous devez convertir la décimale 65 en octal, c'est-à-dire 101, puis vous devez imprimer cette valeur octale comme:Cela s'imprimera
A
.Vous devez donc le modifier pour:
Mais en utilisant
awk
vous pouvez directement imprimer comme en langage Cla source
bash
etzsh
cela peut se faire sans la boucle et sans la commande externe:printf $(printf '\%o' {32..127})
.(char)(127)
retour arrière ou quelque chose comme ça. Quoi qu'il en soit, il apparaît comme l'une des cases hexagonales ou comme on les appelle. Si vous ne voulez que le "imprimable" (c'est-à-dire lisible), allez simplement au 126. Aussi, belle pensée avec l'octal. C'est malin; Je pensais en termes hexadécimaux (commeprintf '\x%x; {32..126}
... ou 127, je suppose, puisque vous l'avez tous fait aussi), mais cela ne fonctionne pas. Octal sauve la mise! :) Enfin, @Ifthikhan, je ne sais pas ce que vous voulez dire.awk
utilise souvent des commandes de style C et nulle part ailleurs n'est%c
utilisée. L'utilisation de nombres octaux est différente de l'utilisation de caractères à un octet.%c
Interprète l'argument associé comme char: seul le premier caractère d'un argument donné est impriméVous semblez déjà avoir un moyen de les imprimer, mais voici une variante.
la source
Vous en avez besoin
printf
, mais une seule fois; vous pouvez remplacer une utilisation deprintf
par lesecho
séquences d'échappement plus simples et plus efficaces de Bash:Avec hexagesimaux:
Avec octales:
la source