2010-08-08 12 views
16

Quiero hacer algo. como este:Eliminar la entrada de la matriz

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

¿Cómo puedo eliminar una entrada de una matriz? foo-=b no funciona.

La eliminación debe funcionar sin importar dónde se encuentre la entrada.

Respuesta

26

Para quitar el elemento número $i: a=("${(@)a[1,$i-1]}" "${(@)a[$i+1,$#a]}")

(La construcción más simple a=($a[1,$i-1] $a[$i+1,$#a]) también elimina los elementos vacíos.)

Añadido:

para eliminar cualquier aparición de b: a=("${(@)a:#b}")
:# es el jeroglífico para eliminar elementos coincidentes; "" y (@) funciona correctamente en las matrices, incluso si contienen elementos vacíos.

+0

Esto se ve bastante complicado. Además, ¿cómo obtengo '$ i'? Solo quiero eliminar 'b'. – Albert

+0

@Albert: He agregado cómo eliminar por contenido. – Gilles

+0

Gracias, esa adición es exactamente lo que quería. – Albert

4

foo = (1 2 3)

shift foo

print $foo da: 2 3

Así que esto elimina el primer elemento (es eso lo que quieres?)

[editado]

remove el i-ésimo elemento con

foo[$i] =()

en su lugar.

+0

Esto solo funciona si la entrada está en el índice 0. – Albert

+0

No, quiero eliminar la entrada donde sea (no siempre es al principio). – Albert

+0

¿Qué es '$ i'? ¿Como lo consigo? – Albert

2

Para quitar el elemento de contenido "b" de matriz:

foo=(a b c) 
foo=(${foo#b}) 
+0

Esto transformará '(foo bar foobar)' en '(barra de barra)'! – blueyed

+0

No, no: 'foo = (foo bar foobar); foo = ($ {foo # barra}); echo $ devuelve foo' 'foo foobar'. –

+1

Incorrecto:' foo = (a ab ac ad); foo = ($ {foo # a}); declare foo' da 'foo = (b c d)' (esperado 'foo = (ab ac ad)'). –

15

Gilles segunda respuesta es correcta si desea eliminar todas las apariciones, pero es una reasignación total de la matriz y no se refiere a la situación donde desea eliminar solo una entrada, independientemente de los duplicados.Hay una manera en zsh para eliminar un elemento de una matriz normal sin reasignación de toda la matriz:

Dada la siguiente matriz:

array=(abc def ghi) 

la siguiente devolverá el índice del primer partido para def:

${array[(i)def]} 

y el formato siguiente se puede utilizar para eliminar cualquier valor indexado dado (el índice de elemento 2 en este ejemplo) en una matriz sin reasignación de toda la matriz:

array[2]=() 

por lo tanto, para quitar el valor def que combinar los dos:

array[$array[(i)def]]=() 

Esto es más limpio para la eliminación de un solo elemento, ya que no hay matriz explícita reasignación (limpiador en que los posibles efectos secundarios, tales como la eliminación accidental de elementos vacíos, problemas de formato citados, etc. no aparecerán). Sin embargo, la solución de Gilles es en gran medida equivalente y tiene la ventaja de eliminar múltiples elementos coincidentes, si eso es lo que quieres. Con su método y este método, tiene un conjunto de herramientas completo para la eliminación de elementos de matriz estándar.

+0

¡Gran respuesta! Bien explicado, upvote! – jpoppe

Cuestiones relacionadas