web-dev-qa-db-fra.com

Comment supprimer complètement un élément d'un tableau?

unset array[0] supprime l'élément mais toujours si je le fais echo ${array[0]} J'obtiens une valeur nulle en plus il y a d'autres façons de faire mais si un élément d'un tableau contient des espaces comme ci-dessous

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

mais ceux-ci ne font pas non plus le travail

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

maintenant je veux que le nouveau tableau soit comme

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

Les espaces causent des problèmes après l'affectation et le tableau réel devient semblable à la substitution.

array=(mary randy orton)
53
munish

Utilisez simplement la syntaxe du tableau sur l'affectation et citez votre variable:

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

Modifier selon la question dans le commentaire. Pour $@ vous pouvez l'utiliser comme ceci:

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

Cela m'a fait réfléchir. Le problème avec sed/awk/tail est qu'ils sont ligne par ligne. Après avoir supprimé la première ligne, vous devez écrire toutes les autres lignes de l'espace de motif dans le fichier.

  • Vous pouvez utiliser les commandes suivantes pour faire ce que vous voulez en quelques secondes.
  • Cela écrira le fichier entier dans un tableau.
  • Supprimez la première ligne pendant qu'elle la renvoie dans le fichier.

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

Remplacez simplement largefile par le nom de votre fichier.

0
jgshawkey

Pour supprimer un élément à un index particulier, nous pouvons utiliser unset puis faire une copie dans un autre tableau. Seul unset n'est pas requis dans ce cas. Parce que unset ne supprime pas l'élément, il définit simplement une chaîne nulle à l'index particulier dans le tableau.

declare -a arr=('aa' 'bb' 'cc' 'dd' 'ee')
unset 'arr[1]'
declare -a arr2=()
i=0
for element in ${arr[@]}
do
    arr2[$i]=$element
    ((++i))
done
echo ${arr[@]}
echo "1st val is ${arr[1]}, 2nd val is ${arr[2]}"
echo ${arr2[@]}
echo "1st val is ${arr2[1]}, 2nd val is ${arr2[2]}"

La sortie est

aa cc dd ee
1st val is , 2nd val is cc
aa cc dd ee
1st val is cc, 2nd val is dd
0
rashok
#!/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[@]}
~                                                                                                                                                              
~                       
0
MageProspero