web-dev-qa-db-ja.com

数値にゼロを埋め込む

数字にゼロを埋め込もうとしています

a=010
printf "%04d" $a
0008

値を変換する「0010」として「出力」が必要です。

タイプセットで試してみました

a=010
typeset -RZ2 a
echo $a

スクリプトで同じものを使用すると、次のエラーが発生しました。

Invalid -R option
7
user43067

%08.0fを使用した新しい回答

%f10進浮動小数点数を出力するために使用されるため、引数10進数でなければなりません。

したがって、引数がoctalとして解釈されるリスクはありません。

単純に:

a=0010

a=`printf %08.0f $a` 

または

a=$(printf %08.0f $a)

その後

echo $a
00000010

この作業は、POSIX Shellで見つけます

bash の下

bash を使用すると、printf-vオプションを使用してフォークを回避できます。

a=0010
printf -v a %08.0f $a
echo $a
00000010

古い回答(%dを使用)

POSIXの場合 Shell

左の0文字は、次のようにドロップできます。

a=00010
while [ "$a" != "${a#0}" ] ;do a=${a#0};done
printf "%08d" $a
00000010

これは新しいコマンドセッションをフォークしないので、sedを使用するよりも速くなる可能性があります。

bash の下

次の構文で10進解釈を強制できます。

a=000010
printf "%08d" $((10#$a))
00000010

これは変換に役立ちます:

a="0a"
printf "%04d" $((16#$a))
0010

a="00001010"
printf "%04d" $((2#$a))
0010

a="00012"
printf "%04d" $((8#$a))
0010

a="0020"
printf "%04d" $((5#$a))
0010

a="0013"
printf "%04d" $((7#$a))
0010

等々...

a="zz"
printf "%04d" $((36#$a))
1295
11
F. Hauri

これは、たとえば "f"指定子などの別の変換指定子を使用して実現できます。 printf manual から:

f、F

Double引数は丸められ、スタイル[-] ddd.dddの10進表記に変換されます。ここで、小数点文字の後の桁数は精度の指定と同じです。精度がない場合は6と見なされます。精度が明示的にゼロの場合、小数点文字は表示されません。小数点が表示される場合は、その前に少なくとも1桁が表示されます。

ただし、実際には数値の浮動小数点表現は必要ないため、ゼロの精度を指定する必要があります。これはそれを行うはずです:

a=010
printf "%04.0f" $a

Linuxを使用していることを前提としていますが、これは他の種類のUnixでも動作するはずです。

5
Hugo Vieira

typeset -Z4 azshまたはkshで機能します。

数値として解釈される場合、POSIX shおよびprintfでは、先行ゼロがある場合、それは8進数として解釈されます。したがって、それらを取り除く必要があります0s最初:

printf '%04d\n' "${a#"${a%%[!0]*}"}"

または、その問題がないawkを使用することもできます。

awk 'BEGIN{printf "%04d\n", ARGV[1]}' "$a"
4