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

Ber*_*ard 54 bash brace-expansion arithmetic

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

$ echo {8..10}
8 9 10
Run Code Online (Sandbox Code Playgroud)

如何以简单的方式使用此大括号扩展以获得以下输出?

$ echo {8..10}
08 09 10
Run Code Online (Sandbox Code Playgroud)

我现在认为这可以使用seq(没有尝试)获得,但这不是我想要的。

有用的信息可能是我仅限于这个 bash 版本。(如果您有zsh解决方案,但没有bash解决方案,也请分享)

$ bash -version
GNU bash, version 3.2.51(1)-release (x86_64-suse-linux-gnu)
Run Code Online (Sandbox Code Playgroud)

dog*_*ane 86

用 a 前缀第一个数字0以强制每个术语具有相同的宽度。

$ echo {08..10}
08 09 10
Run Code Online (Sandbox Code Playgroud)

来自 Brace Expansion 的 bash 手册页部分:

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

另请注意,您可以使用通过填充前导零来均衡宽度seq-w选项:

$ seq -w 8 10
08
09
10

$ seq -s " " -w 8 10
08 09 10
Run Code Online (Sandbox Code Playgroud)

如果您想要更多控制,您甚至可以指定 printf 样式格式:

$ seq -s " " -f %02g 8 10
08 09 10
Run Code Online (Sandbox Code Playgroud)

  • 然而,在刚刚发现 `echo {08..10}` 解决方案后,它只在 bash 版本 4 及更高版本中引入。 (8认同)
  • 应该注意的是,你也可以在给 `seq` 时使用 `-w` 开关作为数字前缀,如下所示:`seq -w 003` 产生数字 001、002 和 003。 (5认同)

Bit*_*Nix 9

如果你使用 printf

printf "%.2d " {8..10} 
Run Code Online (Sandbox Code Playgroud)

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


小智 8

我有原始海报 ( 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
Run Code Online (Sandbox Code Playgroud)

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


Gil*_*il' 7

使用以常量数字开头的范围并将该数字去掉:

echo \ {108..110} | sed 's/ 1//g'
Run Code Online (Sandbox Code Playgroud)

或不使用外部命令:

a=({108..110}); echo "${a[@]#1}"
Run Code Online (Sandbox Code Playgroud)

在 for 循环中使用:

for x in {108..110}; do
  x=${x#1}
  …
done
Run Code Online (Sandbox Code Playgroud)

虽然在这种情况下,while 循环会更清晰并且适用于任何 POSIX shell:

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