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


45

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

$ 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)

ここで見つけたbash 3でこれを行うためのいくつかのヒント:mywiki.wooledge.org/BashFAQ/018ただし、そこに概説されているアプローチは便利ではありません。
ベルンハルト

回答:


70

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

$ echo {08..10}
08 09 10

ブレースの展開に関するbashのマニュアルページセクションから:

各用語に同じ幅を持たせるために、指定された整数の前に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

8
echo {08..10}ただし、解決策を見つけた後は、bashバージョン4以降でのみ導入されます。
ベルンハルト

それは、bashがそれを行うことを少し不快にしています。perl多数のユーティリティ(たとえば)の場合、先行ゼロは8進数を示します。私はそれは...あなたは8進数のシーケンスをしたいことが多いではないと仮定
kurtm

5
それに続い与えたときにも、数字の前に付けることに留意すべきであるseq-w。そうのようなスイッチseq -w 003番号001、002を生成し、003
SLM

@kurtmは、先行ゼロについて心配しません。何かが数値を解析しようとすると、それが痛いことがあります。これが本当に役立つのはfoo_00001.someextension、ほぼすべてのソートコンテキストが正常な順序を提供するファイル名シーケンスを生成することです。
ステファンゴーリチョン

9

printfを使用する場合

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

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


ご回答有難うございます。私はprintf解決策を知っていますが、実際にこれが簡単になるわけではありません。私は仕事をするいくつかの隠されたトリックがあることを願っています:)
ベルンハルト

これは、パッドする番号の起点の状況を処理するのに十分な汎用性があると思われる唯一の答えです。ファイルをループするときにカウンターを使用しています。このprintfソリューションは完璧にゼロパッドを行いますが、他のすべては既存の数字をゼロで埋めるのではなく、ゼロで埋められた数字を生成することに焦点を合わせているようです。
マイピパイ

7

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

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 3.xの要求を満たすため、他の回答よりもこの回答を受け入れました。特にforとにかくループが必要だったので。
ベルンハルト

6

元のポスター(GNU bash, version 3.2.51(1)-release)と同じbashバージョンを使用{08..12}していますが、動作しませんが、以下は動作します:

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

これはもう少し面倒ですが、OPバージョンのbash(およびそれ以降のバージョンでは動作すると思います)では動作します。


私の場合、私は実際にも数0001 1000年、もちろんあなたの原則作品にしたいが、私は(このソリューションについて考えていませんでした。
ベルンハルト

1

参考までに、自動固定幅は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

-3
for i in $(seq -s " " -f %0${zeros}g $ini $fin); do ....;done

ゼロ、ini、finは変数なので、簡単に、iniをfinに「ゼロ」で言うゼロのみを問題なく書き込むことができます;)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.