web-dev-qa-db-ja.com

ブレース展開を使用して先行ゼロを持つシーケンスを作成する方法

以下を使用すると、期待どおりの結果が得られます。

$ echo {8..10}
8 9 10

このブレース展開を簡単な方法で使用して、次の出力を取得するにはどうすればよいですか?

$ echo {8..10}
08 09 10

これはseqを使用して取得できるようになりました(試行しませんでした)が、それは私が探しているものではありません。

役に立つ情報は、私がこのbashバージョンに制限されていることかもしれません。 (zshソリューションはあるがbashソリューションがない場合は、共有してください)

$ bash -version
GNU bash, version 3.2.51(1)-release (x86_64-suse-linux-gnu)
49
Bernhard

最初の数値の前に0を付けて、各用語が同じ幅になるようにします。

$ echo {08..10}
08 09 10

Brace Expansionのbash manページセクションから:

指定された整数の前に0を付けて、各項を同じ幅にすることができます。 xまたはyのいずれかがゼロで始まる場合、シェルは生成されたすべての項に同じ桁数を含めるように強制し、必要に応じてゼロを埋めます。

また、seq-wオプションとともに使用して、先行ゼロでパディングすることにより幅を均一化できることにも注意してください。

$ seq -w 8 10
08
09
10

$ seq -s " " -w 8 10
08 09 10

より細かく制御したい場合は、printfスタイル形式を指定することもできます。

$ seq -s " " -f %02g 8 10
08 09 10
75
dogbane

printfを使用する場合

printf "%.2d " {8..10} 

これにより、強制的に2文字になり、先頭に0が追加されます。3桁が必要な場合は、「%。3d」に変更できます。

9
BitsOfNix

定数の数字で始まる範囲を使用し、その数字を取り除きます。

echo \ {108..110} | sed 's/ 1//g'

または外部コマンドを使用せずに:

a=({108..110}); echo "${a[@]#1}"

Forループで使用する場合:

for x in {108..110}; do
  x=${x#1}
  …
done

ただし、この場合、whileループはより明確になり、すべてのPOSIXシェルで機能します。

x=8
while [ $x -le 10 ]; do
  n=$((100+x)); n=${n#1}
  …
  x=$((x+1))
done

元のポスターと同じbashバージョン(GNU bash, version 3.2.51(1)-release)と{08..12}は機能しませんが、以下は機能します。

for i in 0{8..9} {10..12}; do echo $i; done
08
09
10
11
12

少し面倒ですが、bashのOPバージョンで動作します(それ以降のバージョンでは、私は想定します)。

6
Gregory Dulin

参考までに、自動固定幅は最新バージョンのbashでのみ発生すると思います。

$ bash -version
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

$ echo test{00..05}
test0 test1 test2 test3 test4 test5
1