从数组中删除条目

时间:2010-08-08 17:41:55

标签: arrays shell zsh

我想做某事。像这样:

foo=(a b c)
foo-=b
echo $foo # should output "a c"

如何从数组中删除条目? foo-=b不起作用。

无论条目在何处,删除都应该有效。

5 个答案:

答案 0 :(得分:31)

要删除元素编号$ia=("${(@)a[1,$i-1]}" "${(@)a[$i+1,$#a]}")

(更简单的构造a=($a[1,$i-1] $a[$i+1,$#a])也会删除空元素。)

<强>增加:

删除ba=("${(@)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