Eu queria gerar uma sequência de todos os caracteres ascii com o seguinte comando
for i in `seq 32 127`; do printf "%c" $i; done
A saída do comando acima é:
33333334444444444555555555566666666667777777777..............
É o primeiro dígito (da esquerda) de cada número.
Procurando neste site, me deparei com a resposta para o meu problema Como imprimir todos os caracteres ASCII imprimíveis na CLI? , no entanto, ainda não entendo por que meu snippet original não gera os caracteres ascii como pretendido.
bash
shell
character-encoding
ascii
Ifthikhan
fonte
fonte
comp.unix.shell
lista de discussão sobre por que isso é a coisa certa;)
Respostas:
Você não pode imprimir diretamente os códigos ascii usando o
printf "%c" $i
tipo em C.Você deve primeiro converter o valor decimal de i em seu valor octal e depois imprimi-lo usando o
printf
e colocando\
na frente dos respectivos valores octais.Para imprimir
A
, você precisa converter o decimal 65 em octal, ou seja, 101 e, em seguida, imprimir esse valor octal como:Isso imprimirá
A
.Então você precisa modificá-lo para:
Mas usando
awk
você pode imprimir diretamente como na linguagem Cfonte
bash
ezsh
isso pode ser feito sem o loop e sem o comando externo:printf $(printf '\%o' {32..127})
.(char)(127)
backspace ou algo assim. Seja o que for, aparece como uma das caixas hexagonais ou como elas são chamadas. Se você quiser apenas o "imprimível" (isto é, legível), vá para 126. Além disso, um bom pensamento com o octal. Isso é inteligente; Eu estava pensando em termos de hexadecimal (comoprintf '\x%x; {32..126}
... ou 127, acho, já que todos vocês fizeram isso também), mas não funciona. Octal salva o dia! :) Finalmente, @Ifthikhan, não sei ao certo o que você quer dizer.awk
geralmente usa comandos no estilo C e em nenhum outro lugar é%c
usado. O uso de números octais é diferente do uso de caracteres de um byte.%c
Interpreta o argumento associado como char: apenas o primeiro caractere de um determinado argumento é impressoVocê parece já ter uma maneira de imprimi-los, mas aqui está uma variante.
fonte
Você precisa
printf
, mas apenas uma vez; você pode substituir um usoprintf
pelasecho
sequências de escape Bash mais simples e mais eficientes :Com hexagesimais:
Com octais:
fonte