【问题标题】:How can zsh array elements be transformed in a single expansion?zsh 数组元素如何在一次扩展中进行转换?
【发布时间】:2017-01-09 23:08:17
【问题描述】:
假设你有一个像这样的 zsh 数组:
a=("x y" "v w")
我想取每个元素的第一个单词,比如:
b=()
for e in $a; {
b=($b $e[(w)0])
}
所以现在我在 b 中有我需要的东西:
$ print ${(qq)b}
'x' 'v'
有没有办法在单个扩展表达式中做到这一点? (即不需要 for 循环来处理每个数组元素并将结果累积到一个新数组中)。
【问题讨论】:
标签:
arrays
shell
zsh
variable-expansion
【解决方案1】:
可以通过从数组的每个元素中从第一次出现的空格到末尾删除来获取单词,如下所示:
$ print ${(qq)a%% *}
'x' 'v'
可以注意到%% 表达式(和其他一些)可用于数组元素:
在以下表达式中,当 name 是一个数组且替换没有被引用时,或者如果使用了 '(@)' 标志或name[@] 语法,则分别对每个数组元素执行匹配和替换。
...
${name%pattern}
${name%%pattern}
如果模式匹配 name 值的结尾,则用删除的匹配部分替换 name 的值;否则,只需替换 name 的值。在第一种形式中,最小的匹配模式是优选的;在第二种形式中,最大匹配模式是首选。
-- zshexpn(1): Expansion, Parameter Expansion