如何从数组中完全删除一个元素?

如何从数组中完全删除一个元素?

unset array[0]删除元素,但如果我这样做,echo ${array[0]}我仍然会得到一个空值,而且还有其他方法可以做到这一点,但如果数组的元素包含如下所示的空格

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

但这些也无法完成这项工作

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

现在我希望新的数组是这样的

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

空格会在分配后引起麻烦,并且实际的数组变得像替换一样。

array=(mary randy orton)

答案1

只需在赋值时使用数组语法并引用您的变量:

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

编辑根据评论中的问题。因为$@你可以像这样使用它:

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

答案2

这让我思考。 sed/awk/tail 的问题是它们是逐行的。删除第一行后,您必须将模式空间中的每隔一行写入文件。

  • 您可以使用以下命令在几秒钟内完成您想要的操作。
  • 这会将整个文件写入数组。
  • 删除第一行,因为它会将其转储回文件中。

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

只需将 更改largefile为您的文件名即可。

答案3

要删除特定索引处的元素,我们可以使用unset然后复制到另一个数组。只是unset在这种情况下不需要。因为unset不删除元素,所以它只是将空字符串设置为数组中的特定索引。

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]}"

输出是

aa cc dd ee
1st val is , 2nd val is cc
aa cc dd ee
1st val is cc, 2nd val is dd

答案4

#!/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[@]}
~                                                                                                                                                              
~                       

相关内容