从 Zsh 中的数组中删除所有空字符串

从 Zsh 中的数组中删除所有空字符串

如何从 Zsh 数组中删除所有空字符串?

a=('a' '' 'b' 'c')
# remove empty elements from array
echo ${(j./.)a}

应该输出a/b/c

答案1

有参数扩展${name:#pattern}(模式可以为空),它将作用于数组的元素:

a=('a' '' 'b' 'c')
echo ${(j./.)a:#}
# If the expansion is in double quotes, add the @ flag:
echo "${(@j./.)a:#}"

man 1 zshexpn

${name:#pattern}如果模式与 name 的值匹配,则替换为空字符串;否则,只需替换 name 的值即可。如果 name 是一个数组,则删除匹配的数组元素(使用该(M)标志删除不匹配的元素)。

答案2

这就是zsh当您不加引号的参数扩展时默认执行的操作。

所以:

a=($a)

将删除数组中的空元素$a


^我通常认为这是一个错误特征。请参阅rc/esfishshell 以获得不执行此操作的更好数组。这可能是为了提供与ksh/稀疏数组的某种程度的兼容性bashksh/bash数组不仅在未加引号的数组扩展时进行空删除(写${a[@]}在那里),而且还进行 split+glob,这意味着您不能真正使用那里未加引号的数组,除非您禁用通配符并设置$IFS为空字符串(IFS=; set -o noglob; a=(${a[@]})然后仅在此处进行空删除zsh除了使数组变得非稀疏之外,还像这样)

答案3

嗯,zsh 有一个:|参数扩展运算符大批减法 - 因此一种笨拙的方法是定义仅包含空元素的第二个数组

b=('')

然后做

 % echo ${(j./.)a:|b}

a/b/c

然而感觉就像在那里应该是一种无需额外数组即可完成此操作的方法

...确实

相关内容