Imprimindo decimal para o caractere ascii, meu comando não exibe como pretendido

12

Eu queria produzir uma string 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.

Olhando através deste site, encontrei a resposta para o meu problema Como imprimir todos os caracteres ASCII imprimíveis na CLI? , no entanto, ainda não entendo porque meu fragmento original não exibe os caracteres ascii como pretendido.

    
por Ifthikhan 04.08.2012 / 12:39

3 respostas

11

Você não pode imprimir diretamente os códigos ascii usando printf "%c" $i como em C.

Você tem que primeiro converter o valor decimal de i em seu valor octal e então você deve imprimi-lo usando printf e colocando \ na frente de seus respectivos valores octal.

Para imprimir A , você precisa converter o decimal 65 em octal, ou seja, 101, e então você deve imprimir esse valor octal como:

printf "1\n"

Isso imprimirá A .

Então você precisa modificá-lo para:

for i in 'seq 32 127'; do printf \$(printf "%o" $i);done;

Mas usando awk você pode imprimir diretamente como na linguagem C

awk 'BEGIN{for(i=32;i<=127;i++)printf "%c",i}';echo
    
por 04.08.2012 / 13:31
3

%c Interpreta o argumento associado como char: somente o primeiro caractere de um determinado argumento é impresso

Você parece já ter uma maneira de imprimi-los, mas aqui está uma variante.

for i in 'seq 32 127'; do printf "\x$(printf "%x" $i) $i"; done
    
por 04.08.2012 / 13:34
0

Você precisa de printf , mas apenas uma vez; você pode substituir um uso de printf pelas seqüências de escape Bash mais simples e mais eficientes echo plus:

com hexagesimais:

for i in 'seq 32 127'; do
  echo -ne \x$(printf %02x $i)
done

Com octais:

for i in 'seq 32 127'; do
  echo -ne \0$(printf %03o $i)
done
    
por 08.10.2018 / 22:19