2017-01-09 76 views
1

假設你有一個zsh的陣列,如:如何在單個擴展中轉換zsh數組元素?

a=("x y" "v w") 

我想利用每一個元素的第一個字,說:

b=() 
for e in $a; { 
    b=($b $e[(w)0]) 
} 

所以現在我有什麼,我需要在B:

$ print ${(qq)b} 
'x' 'v' 

有沒有辦法在單個擴展表達式中執行此操作? (即不需要for循環來處理每個數組元素並將結果累加到一個新數組中)。

回答

2

這可能是可以通過從白色空間的第一次出現在陣列這樣的每個元素去除到端取詞:

$ print ${(qq)a%% *} 
'x' 'v' 

它coulde注意,%%表達式(和其他一些)可以用於數組元素:

在下面的表達式中,當名稱爲陣列,並且所述取代不是引用,或者如果使用了「(@)」標誌或name[@]語法,匹配和更換被執行每個數組元素分開。
...

${name%pattern}
${name%%pattern}

如果模式名稱的值的末端匹配,則刪除與所述匹配部分替代名稱的值;否則,只需替換名稱的值即可。在第一種形式中,最小的匹配模式是優選的;在第二種形式中,最大的匹配模式是優選的。

- zshexpn(1): Expansion, Parameter Expansion

+0

謝謝!這樣可行! –