2013-08-02 70 views
5

我知道如何轻松地生成一个列表这样括号扩展列表:如何生成特定的顺序

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

像从端排序,或者从字符Ñ任何诀窍是行,只要它适合在一行上。我也使用zsh,但使用bash的东西很好。

回答

6

这是没有实现,但你可以使用一个丑陋的黑客就像

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

积极评价第一,后者梅开二度,并在第二个步骤中的第一支柱来实现它。

但是要记住的是,中间步骤必须足够小,到现在还由外壳;-)

+1

+1为最后一句。 –

1

我想补充另一种方法解决这个问题有不同的黑客可解析。它基于转动的表达,评价它,然后,然后再回到转动结果:

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 

但我不知道我真的可以建议这样做;-)

1

没有严格的bash-内部,但

printf "%s\n" {a,b,c,d}_{0..3} | sort -t_ -k2,2n 
2

我还发现了一个其他的解决方案(zsh中只),needlessl Ÿ复杂,因此有趣:

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

这到底是怎么做的zsh?它始于最后嵌套支架和:

  • 检查,如果存在$$,所以用 “0 1 2 3”(操作者+)
  • 将它分成一个数组(操作员=)
  • 申请分布每个元素的字符串,如括号扩展(操作^)
  • 终于将第一支柱的扩张

注意,我必须扩大{0..3}(因为比起参数扩展括号扩展的低优先级的),我自我,因为没有船旗国/运营商可以触发这种AFAIK的初步扩展(除上述eval外)。