形式は次のとおりです。AAA-111
AAA
どこで可能であり、[A-Z][A-Z][A-Z]
そう111
することができますか?[0-9][0-9][0-9]
質問:すべての可能なバリアントを生成するためにbashスクリプトをどのように書くことができますか?
答え1
Chaosが指摘したように、これを達成するために中括弧拡張を使用できます。ただし、-
形式に応じて有効にするには、その間の項目を忘れないでください。
echo {A..Z}{A..Z}{A..Z}-{000..999}
1行に1つの項目が必要な場合は、for
次のようにループでラップできます。
for i in {A..Z}{A..Z}{A..Z}-{000..999}
do
echo "$i"
done
> /path/to/file
でこれを行うことができますdone
。
ループを使用したくない場合は、for
次を使用することもできます。tr
1行に1つの項目を印刷するようにします。
echo {A..Z}{A..Z}{A..Z}-{000..999} | tr " " "\n"
別のオプションはprintf
リストとして印刷することです。これで1つを節約できますtr
。
printf '%s\n' {A..Z}{A..Z}{A..Z}-{000..999}
答え2
答え3
多くのメモリ使用を防ぐために、ネストされたループを使用してください。
for az1 in {A..Z}; do
for az2 in {A..Z} _; do
for az3 in {A..Z} _; do
for d1 in {0..9}; do
for d2 in {0..9}; do
printf "$az1$az2$az3-$d1$d2%i\n" {0..9}
done
done
done
done
done | sed 's/_*-0*/-/'
オプションで、短い文字列をサポートするためにアンダースコアを追加し、完全な形式A-1
で合計のような結果を得るために先行ゼロを削除しました。 (この操作をキャンセルする方法については、編集履歴を確認してください。)AB-12
ABC-123
答え4
通常、中かっこ拡張を使用してこれらのリストを作成できますが、大きすぎるため、問題は発生しません。約1700万の単語にもかかわらず、Bash 4.4は2 GBのメモリを持つ仮想マシンでリストを正常に作成できず、1.5分後に出力を生成せずにクラッシュしました。
Perlのようなものが良いかもしれません。
perl -le 'foreach $i ("AAA".."ZZZ") { foreach $j ("000".."999") { print "$i-$j" }} ; ' > plates
約5秒以内にリストが生成されます。
Bashでこれを行う必要がある場合は、タスクをより小さなループに分割します。
しかし、実際に達成したいことを達成するより良い方法があるかどうか疑問に思います。 1,700万台の自動車ナンバープレートがすべて含まれていないデータがある場合は、そのナンバープレートをすべて保存する必要はありません。その場合は、シェル以外のもの(データベースなど)を使用できます。