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


14

次のコマンドですべてのASCII文字の文字列を出力したかった

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

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

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

これは、各番号の最初の(左から)桁です。

このサイトを見ると、私の問題に対する答えが見つかりました。CLIですべての印刷可能なASCII文字を印刷するにはどうすればよいですか?ただし、元のスニペットが意図したとおりにASCII文字を出力しない理由はまだわかりません。


1
POSIXがこれを指示します。これがなぜ正しいかについてのcomp.unix.shellスレッドです;)
-sr_

@sr_スレッドを指摘してくれてありがとう。私が探していた説明がありました。
イフチカン

回答:


13

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

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

印刷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

7
In bashおよびzshこれは、ループおよび外部コマンドなしで実行できますprintf $(printf '\%o' {32..127})
マナトワーク

@manatwork:正確に..指摘して
くれてありがとう

1
@pradeepchhetri:詳細な回答をありがとうございます。必要な詳細のほとんどを網羅しているようです(そのため、回答を選択します)。しかし、unix.derkeiler.com / Newsgroups / comp.unix.shell / 2007-07 /…の次のメッセージにある重要な情報を見逃したと思います。これは、「対応する変換指定子はB、C、またはSであれば...引数のオペランドが文字列として扱われなければならない」と述べている
Ifthikhan

(char)(127)バックスペースなどではありません。それが何であれ、それは16進数ボックスの1つまたはそれらが呼び出されるものとして表示されます。「印刷可能」(つまり、読み取り可能)のみが必要な場合は、126に移動します。また、8進数を使用するのもよい考えです。それは賢いです。私は16進数の観点で考えていました(printf '\x%x; {32..126}...または127のように、みなさんもそれをやったので推測します)が、うまくいきません。Octalは日を救います!:)最後に、@ Ifthikhan、私はあなたが何を意味するのか分かりません。awk多くの場合、Cスタイルのコマンドを%c使用し、他の場所は使用しません。8進数の使用は、1バイト文字の使用とは異なります。
ディラン14年

3

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

あなたはすでにそれらを印刷する方法を持っているように見えますが、ここに1つのバリアントがあります。

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

0

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

ヘキサゲシマルの場合:

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

オクタルあり:

for i in `seq 32 127`; do
  echo -ne \\0$(printf %03o $i)
done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.