如何使用大括号扩展创建带有前导零的序列

如何使用大括号扩展创建带有前导零的序列

当我使用以下内容时,我得到了预期的结果:

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

答案1

在第一个数字前面加上 a 前缀,以0强制每个项具有相同的宽度。

$ echo {08..10}
08 09 10

来自 bash 手册页有关大括号扩展的部分:

提供的整数可以以 0 为前缀,以强制每个项具有相同的宽度。当 x 或 y 以零开头时,shell 会尝试强制所有生成的项包含相同数量的数字,并在必要时进行零填充。

另请注意,您可以使用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

答案2

我有与原始海报 ( 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

这有点乏味,但它确实适用于 bash 的 OP 版本(我认为是更高版本)。

答案3

如果你使用 printf

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

这将强制为 2 个字符,并添加前导 0。如果您需要 3 个数字,您可以更改为“%.3d”。

答案4

作为参考,我认为自动固定宽度仅出现在最新版本的 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

相关内容