2013-08-02 69 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外)。