次のコマンドですべてのASCII文字の文字列を出力したいと思いました
for i in `seq 32 127`; do printf "%c" $i; done
上記のコマンドの出力は次のとおりです。
33333334444444444555555555566666666667777777777..............
各番号の最初の(左から)桁です。
このサイトを見て、問題の答えを見つけました すべての印刷可能なASCII文字をCLIで印刷する方法 ですが、なぜ元のスニペットの理由がまだわかりません意図したとおりにASCII文字を出力しません。
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
%c
関連する引数をcharとして解釈します。指定された引数の最初の文字のみが出力されます
あなたはすでにそれらを印刷する方法を持っているようですが、これは1つの変種です。
for i in `seq 32 127`; do printf "\x$(printf "%x" $i) $i"; done
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