6

我知道如何以这种方式轻松生成列表:

echo {a,b,c,d}_{0..3}

这将给出:

a_0 a_1 a_2 a_3 b_0 b_1 b_2 b_3 c_0 c_1 c_2 c_3 d_0 d_1 d_2 d_3

但是如何生成相同的列表,但第二个大括号被以更高的优先级消耗,以获得这个?:

a_0 b_0 c_0 d_0 a_1 b_1 c_1 d_1 a_2 b_2 c_2 d_2 a_3 b_3 c_3 d_3

任何技巧,如从末尾排序或从字符n排序都可以,只要它适合一行。我也在使用 zsh,但是使用 bash 的东西很好。

4

5 回答 5

7

那没有实现,但你可以使用一个丑陋的黑客,比如

echo $(eval echo \{a,b,c,d\}_{0..3})

通过积极地首先评估后一个大括号并在第二步中评估第一个大括号来实现它。

请记住,中间步骤必须足够小才能仍然可以被 shell 解析;-)

于 2013-08-02T11:27:19.480 回答
2

我想添加另一种方法,用不同的技巧解决这个问题。它基于翻转表达式,然后对其进行评估,然后再次将结果返回:

eval echo $(echo '{a,b,c,d}_{0..3}' | rev | tr '{}' '}{') | rev

结果是

a_0 b_0 c_0 d_0 a_1 b_1 c_1 d_1 a_2 b_2 c_2 d_2 a_3 b_3 c_3 d_3

但我不确定我真的可以提议这样做;-)

于 2013-08-02T12:28:04.323 回答
2

我还找到了另一个解决方案(仅限 zsh),不必要的复杂,因此很有趣:

print {a,b,c,d}_${^=${$+0 1 2 3}}

zsh 在这里做什么?它从最后一个嵌套大括号开始,并且:

  • 检查 $$ 是否存在,所以使用“0 1 2 3”(运算符 +)
  • 将其拆分为一个数组(运算符 =)
  • 将每个元素的分布应用于字符串,如大括号扩展(运算符 ^)
  • 最后应用第一个大括号的扩展(因为大括号扩展的优先级低于参数扩展)

请注意,我必须扩展{0..3}自己,因为没有标志/操作员可以触发这种 AFAIK 的初步扩展(eval如上所述除外)。

于 2013-08-02T13:27:16.110 回答
2

不是严格意义上的 bash-in-house,而是

printf "%s\n" {a,b,c,d}_{0..3} | sort -t_ -k2,2n
于 2013-08-02T13:23:26.483 回答
0
eval echo \{a..d\}_{0..3}

足够的

第一个扩展——通过外壳——是

{a..d}_0 {a..d}_1 {a..d}_2 {a..d}_3

eval 的第二个扩展是

a_0 b_0 c_0 d_0 a_1 b_1 c_1 d_1 a_2 b_2 c_2 d_2 a_3 b_3 c_3 d_3

结果被发送到标准输出。

于 2018-04-17T09:48:39.420 回答