Как я могу удалить элемент из массива полностью?

Можно также сделать это без способности путем выполнения apt-cache show <packagename>

51
18.03.2013, 19:26
4 ответа

Просто используйте синтаксис массива на присвоении и заключите Вашу переменную в кавычки:

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

Редактирование согласно вопросу в комментарии. Для $@ можно использовать его как это:

set -- "${@:2}" #removed the 1st parameter
71
27.01.2020, 19:33
  • 1
    Обратите внимание, что это не удаляет 1-й элемент, но элемент indice 0 и повторно присваивает индексы. Если первый элемент был на indice 12, он не удалит, почти повторно присвоит индексы так, чтобы то, что однажды было на indice 12, теперь было на indice 0. Это - вероятно, не беспокойство в случае OP, но должно, вероятно, быть отмечено для дальнейшего использования. Поведение отличается с zsh чьи массивы не являются разреженными вопреки ksh или удару. –  Stéphane Chazelas 18.03.2013, 15:05
  • 2
    Привет @StephaneChazelas. Исключительным из "индексов" является "индекс". Спасибо за Ваш комментарий! –  Steven Lu 11.08.2013, 02:09
  • 3
    @manatwork - ре: Ваше редактирование - почему не использование shift ? –  don_crissti 08.09.2016, 12:53
  • 4
    @don_crissti, положительная сторона. Я сфокусировался на различии в индексации и не думал далее. Также имевший в виду ситуация, когда необходимо отбросить переменное количество объектов, например, для хранения точно последних 3: array=("${array[@]: -3}") и set -- "${@: -3}". Так упорно продолженный индексы. –  manatwork 08.09.2016, 13:16
  • 5
    shift $[$#-3] поскольку последние 3, вероятно, намного быстрее для $@ –  Tino 11.12.2016, 12:21
#!/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[@]}
~                                                                                                                                                              
~                       
-1
27.01.2020, 19:33
  • 1
    , Это было бы намного лучше, если бы было что-то, чтобы объяснить, как это работает и не только блоб кода. И что с тильдами внизу? –  a CVn 08.10.2013, 23:16
  • 2
    Серьезно, Вы корректны. Это действительно похоже на него, был записан хулиганом, но спасибо. Я действительно только добираюсь для стащения этой промежуточной порции гамбургера дни. –  MageProspero 09.10.2013, 09:54
  • 3
    Если какой-либо элемент q будет иметь пробелы в нем, то это разобьет его в несколько элементов. –  William Everett 21.08.2014, 23:40

Это заставило меня задуматься. Проблема с sed / awk / tail в том, что они построчно. После удаления первой строки вы должны записать каждую вторую строку из пространства шаблонов в файл.

  • Вы можете использовать следующие команды, чтобы делать то, что вы хотите, за секунды.
  • Это запишет весь файл в массив.
  • Удалите первую строку, поскольку она выгружает ее обратно в файл.

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

Просто измените большой файл к имени вашего файла.

0
27.01.2020, 19:33

Чтобы удалить элемент по определенному индексу, мы можем использовать 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
0
27.01.2020, 19:33

Теги

Похожие вопросы