2014-09-24 40 views
0
$ echo {A,B}{1,2,3}.pdf 
A1.pdf A2.pdf A3.pdf B1.pdf B2.pdf B3.pdf 

我怎樣可以得到以下的輸出:如何通過擴大在bash獲得所需的順序

A1.pdf B1.pdf A2.pdf B2.pdf A3.pdf B3.pdf 

感謝。

+0

與所有的[通常的警告(http://mywiki.wooledge.org/ParsingLs),'LS [AB] [123] .pdf |排序-V' – tripleee 2014-09-24 05:39:54

回答

1
for n in 1 2 3; do for l in A B; do echo -n "$l$n.pdf "; done; done; echo 

or 

for n in {1..3}; do for l in {A..B}; do echo -n "$l$n.pdf "; done; done; echo 
+0

謝謝。 (1)循環範圍'1 2 3'是否是一個列表?我們可以寫得更清楚/明確,以便它是一個列表? (2)我的問題可以在沒有循環的情況下完成嗎? – Tim 2014-09-24 02:45:56

+0

@Tim你會如何「更清楚/更明確地寫清楚」作爲清單?你的意思是擴張嗎? – 2014-09-24 02:47:15

+0

@Tim:1 2 3被視爲字符串。你可以使用$(seq 1 3)來獲得一個可編程序列。有些命令會映射ascii以從A B C獲得相同的效果,同時適用所有的注意事項。我不認爲你沒有循環就可以做到。 bash的文檔說,從左到右的順序被保留在括號擴展中。 – Leo 2014-09-24 02:49:02

1
$ for n in 1 2 3; do printf '%s ' {A,B}"$n.pdf"; done; echo 
A1.pdf B1.pdf A2.pdf B2.pdf A3.pdf B3.pdf 

$ for n in 1 2 3; do echo -n {A,B}"$n.pdf "; done; echo 
A1.pdf B1.pdf A2.pdf B2.pdf A3.pdf B3.pdf 

$ for n in 1 2 3; do echo -n {A,B}"$n.pdf"; echo -n " "; done; echo 
A1.pdf B1.pdf A2.pdf B2.pdf A3.pdf B3.pdf 

# One of the relatively rare times where not quoting a command substitution is useful. 
$ echo $(printf %s\\n {A,B}{1,2,3}.pdf | sort -k1.2,1.2) 
A1.pdf B1.pdf A2.pdf B2.pdf A3.pdf B3.pdf 

# Same idea as above but with different all-on-one line mechanism. 
$ printf %s\\n {A,B}{1,2,3}.pdf | sort -k1.2,1.2 | tr '\n' ' '; echo 
A1.pdf B1.pdf A2.pdf B2.pdf A3.pdf B3.pdf 
3

括號擴展的結果沒有排序從左到右的順序被保留。

爲了達到您想要的輸出,您可以執行以下操作,但您可以看到它可能會變得複雜得多快。

$ echo {{A,B}1,{A,B}2,{A,B}3}.pdf 
A1.pdf B1.pdf A2.pdf B2.pdf A3.pdf B3.pdf 

簡單loop應易於擴展和閱讀:

$ for n in {1..3}; do list+=({A..B}$n.pdf); done; echo "${list[@]}" 
A1.pdf B1.pdf A2.pdf B2.pdf A3.pdf B3.pdf 

我已經使用了中間陣列存儲擴展名。您可以選擇將它們打印爲您的相遇。我假設你的意圖是一旦他們被生成,就會對他們做些什麼。

4

我想這是欺騙,但它確實得到所需的輸出:

echo fdp.{3,2,1}{B,A} | rev 
+0

這不是作弊。這很聰明! – 2014-09-24 05:22:54