web-dev-qa-db-ja.com

10進数をASCII文字に出力すると、コマンドが意図したとおりに出力されません。

次のコマンドですべてのASCII文字の文字列を出力したいと思いました

for i in `seq 32 127`; do printf "%c" $i; done

上記のコマンドの出力は次のとおりです。

33333334444444444555555555566666666667777777777..............

各番号の最初の(左から)桁です。

このサイトを見て、問題の答えを見つけました すべての印刷可能なASCII文字をCLIで印刷する方法 ですが、なぜ元のスニペットの理由がまだわかりません意図したとおりにASCII文字を出力しません。

14
Ifthikhan

Cのようにprintf "%c" $iを使用してASCIIコードを直接印刷することはできません。

最初にiの10進値を8進値に変換し、次にprintfを使用して、それぞれの8進値の前に\を付けて印刷する必要があります。

Aを印刷するには、10進数の65を8進数、つまり101に変換する必要があります。次に、その8進数の値を次のように印刷する必要があります。

printf "\101\n"

これはAを出力します。

したがって、次のように変更する必要があります。

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

しかし、awkを使用すると、C言語のように直接印刷できます

awk 'BEGIN{for(i=32;i<=127;i++)printf "%c",i}';echo
14
pradeepchhetri

%c関連する引数をcharとして解釈します。指定された引数の最初の文字のみが出力されます

あなたはすでにそれらを印刷する方法を持っているようですが、これは1つの変種です。

for i in `seq 32 127`; do printf "\x$(printf "%x" $i) $i"; done
3
Peter.O

printfが必要ですが、1回だけです。 printfの1つの使用法を、より単純で効率的なechoとBashエスケープシーケンスで置き換えることができます。

16進数で:

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

8進数の場合:

for i in `seq 32 127`; do
  echo -ne \\0$(printf %03o $i)
done
0
Luchostein