¿Cómo puedo eliminar un elemento de una matriz por completo?

unset array[0] elimina el elemento, pero aun así si hago echo ${array[0]} obtengo un valor nulo, además hay otras forms de hacerlo, pero si un elemento de una matriz contiene espacios como los siguientes

 array[0]='james young' array[1]='mary' array[2]='randy orton' 

pero estos tampoco hacen el trabajo

 array=${array[@]:1} #removed the 1st element 

ahora quiero que la nueva matriz sea como

 array[0]='mary' array[1]='randy orton' 

Los espacios causan el problema después de la asignación y la matriz real se convierte en una sustitución.

 array=(mary randy orton) 

Simplemente use la syntax de matriz en la tarea y cite su variable:

 array=("${array[@]:1}") #removed the 1st element 

Edita según la pregunta en el comentario. Por $@ puedes usarlo así:

 set -- "${@:2}" #removed the 1st parameter 

Esto me hizo pensar. El problema con sed / awk / tail es que son línea por línea. Después de eliminar la primera línea, debe escribir cada dos líneas desde el espacio del patrón hasta el file.

  • Puede usar los siguientes commands para hacer lo que quiera en segundos.
  • Esto escribirá el file completo en una matriz.
  • Elimine la primera línea, ya que la devuelve al file.

     readarray -t aLargeFile < <(cat largefile) echo "${aLargeFile[@]:1}" >largefile 

Simplemente cambie el largefile por el nombre de su file.

 #!/bin/bash q=( one two three four five ) echo -e " (remove) { [:range:] } <- [:list:] | [:range:] => return list with range removed range is in the form of [:digit:]-[:digit:] " function remove { if [[ $1 =~ ([[:digit:]])(-([[:digit:]]))? ]]; then from=${BASH_REMATCH[1]} to=${BASH_REMATCH[3]} else echo bad range fi;shift array=( ${@} ) local start=${array[@]::${from}} local rest [ -n "$to" ] && rest=${array[@]:((${to}+1))} || rest=${array[@]:((${from}+1))} echo ${start[@]} ${rest[@]} } q=( `remove 1 ${q[*]}` ) echo ${q[@]} ~ ~