我想做某事。像这样:
foo=(a b c)
foo-=b
echo $foo # should output "a c"
如何从数组中删除条目? foo-=b
不起作用。
无论条目在何处,删除都应该有效。
答案 0 :(得分:31)
要删除元素编号$i
:a=("${(@)a[1,$i-1]}" "${(@)a[$i+1,$#a]}")
(更简单的构造a=($a[1,$i-1] $a[$i+1,$#a])
也会删除空元素。)
<强>增加:强>
删除b
:a=("${(@)a:#b}")
的任何事件
:#
是删除匹配元素的象形文字; ""
和(@)
即使在数组中包含空元素也能正常运行。
答案 1 :(得分:21)
Gilles第二个答案是正确的,如果你想删除所有出现,但它是数组的完全重新分配,并没有解决你想要只删除一个条目的情况,无论重复。在zsh中有一种方法可以从正常数组中删除元素而无需重新分配整个数组:
给出以下数组:
array=(abc def ghi)
以下内容将返回def
的第一个匹配项的索引:
${array[(i)def]}
以下格式可用于删除数组中任何给定的索引值(此示例中的元素索引2),而无需重新分配整个数组:
array[2]=()
因此,要删除值def
,我们将两者结合起来:
array[$array[(i)def]]=()
这对于单个元素删除更加清晰,因为没有明确的数组重新分配(更清晰,因为任何潜在的副作用,例如意外删除空项目,引用格式问题等都不会突然出现)。然而,Gilles的解决方案在很大程度上是等效的,并且具有多个匹配项目移除的优势,如果这是您想要的。使用他的方法和方法,您可以获得用于标准数组元素删除的完整工具集。
答案 2 :(得分:4)
foo = (1 2 3)
shift foo
print $foo
给出:2 3
所以这会删除第一个元素(那就是你想要的吗?)
[编辑]
用
删除第i个元素 foo[$i] =()
代替。
答案 3 :(得分:2)
从数组中删除内容为“b”的元素:
foo=(a b c)
foo=(${foo#b})
答案 4 :(得分:1)
自版本4.2 and 5.0起,zsh接受${name:|arrayname}
语法。 From manual:
如果
arrayname
是数组变量的名称(N.B.,不是内容),则arrayname
中包含的所有元素都将从name
的替换中删除。
因此,它完全符合您的期望:
$ foo=(a b c)
$ excl=(b)
$ echo ${foo:|excl}
a c