Entfernen Sie das Element aus der Array-Shell
Brauche ich zum entfernen eines Elements aus einem array in der bash-shell.
Generell würde ich einfach tun:
array=("${(@)array:#<element to remove>}")
Leider das element I entfernen möchten, ist eine variable, so kann ich nicht verwenden, die dem vorherigen Befehl.
Hier unten ein Beispiel:
array+=(pluto)
array+=(pippo)
delete=(pluto)
array( ${array[@]/$delete} ) -> but clearly doesn't work because of {}
Irgendeine Idee?
InformationsquelleAutor der Frage Alex | 2013-05-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den folgenden arbeiten, wie Sie möchten, in
bash
undzsh
:Wenn löschen müssen, um mehr als ein element:
VORBEHALT
Diese Technik tatsächlich entfernt Präfixe passenden
$delete
aus den Elementen, nicht unbedingt ganze Elemente.Update
Wirklich zu entfernen, eine genaue Position, die Sie brauchen, um einen Spaziergang durch das array, vergleichen Sie das Ziel, jedes element und mit
unset
zu löschen, wird eine genaue übereinstimmung.Beachten Sie, dass wenn Sie dies tun, und ein oder mehrere Elemente entfernt wird, werden die Indizes nicht mehr eine kontinuierliche Abfolge von zahlen.
Die einfache Tatsache ist, dass arrays nicht entwickelt wurden für den Einsatz als veränderliche Datenstrukturen. Sie sind in Erster Linie verwendet für die Speicherung von Listen von Elementen in eine einzelne variable, ohne zu verschwenden einen Zeichen als Trennzeichen verwenden (z.B. zum speichern einer Liste von strings können Leerzeichen enthalten darf).
Wenn Lücken ein problem sind, dann brauchen Sie, um den Wiederaufbau der array um die Lücken zu füllen:
InformationsquelleAutor der Antwort chepner
Sie bauen könnten, bis ein neues array ohne die unerwünschten Elemente, dann weisen Sie es zurück auf das alte array. Dies funktioniert in
bash
:Damit ergibt sich:
InformationsquelleAutor der Antwort Steve Kehlet
Zur Erweiterung auf den oben genannten Antworten, werden die folgenden verwendet werden können, zu entfernen mehrerer Elemente aus einem array, ohne partial matching:
Dies wird Ergebnis in ein array mit:
(zwei onetwo drei threefour "eine sechs")
InformationsquelleAutor der Antwort Dylan
Dies ist der direkteste Weg, um unset einen Wert, wenn Sie wissen, dass es die position.
InformationsquelleAutor der Antwort signull
POSIX-shell-Skript nicht über arrays.
So dass die meisten wahrscheinlich verwenden Sie eine bestimmte Mundart wie
bash
korn-shells oderzsh
.Daher deine Frage jetzt nicht beantwortet werden können.
Vielleicht ist dies für Sie arbeitet:
InformationsquelleAutor der Antwort Anony-Mousse
Hier ist eine (sehr wahrscheinlich bash-spezifisch) kleine Funktion mit bash-variable Dereferenzierung und
unset
; es ist eine Allgemeine Lösung, die nicht die text-Ersetzung oder Entsorgung von leeren Elementen und hat keine Probleme mit dem zitieren/Leerzeichen etc.Verwenden Sie es wie
delete_ary_elmt ELEMENT ARRAYNAME
ohne$
Siegel. Schalten Sie die== $word
für== $word*
für Präfix übereinstimmt; verwenden${elmt,,} == ${word,,}
für groß- /Kleinschreibung nicht übereinstimmt; etc., was auch immer bash[[
unterstützt.Es funktioniert durch die Bestimmung der Indizes der input-array und Durchlaufen Sie nach hinten (also löschen von Elementen nicht vermasseln iteration Reihenfolge). Um die Indizes, die Sie benötigen, um den Zugriff auf die Eingabe-array von Namen, die getan werden kann, über die bash-variable Dereferenzierung
x=1; varname=x; echo ${!varname} # prints "1"
.Können Sie keinen Zugriff auf arrays mit Namen wie
aryname=a; echo "${$aryname[@]}
gibt Ihnen dies einen Fehler. Sie können nichtaryname=a; echo "${!aryname[@]}"
dies gibt Ihnen die Indizes der Variablenaryname
(obwohl es nicht ist ein array). Was funktioniert istaryref="a[@]"; echo "${!aryref}"
die gedruckt werden die Elemente des Arraysa
die Erhaltung der shell-Wort zu zitieren und Leerzeichen genau wieecho "${a[@]}"
. Dies funktioniert aber nur für das drucken der Elemente in einem array nicht für den Druck seiner Länge oder Indizes (aryref="!a[@]"
oderaryref="#a[@]"
oder"${!!aryref}"
oder"${#!aryref}"
Sie alle nicht).So, ich kopiere das original-array, indem Sie seinen Namen über bash-Umweg und Holen Sie sich die Indizes der Kopie. Durchlaufen die Indizes in umgekehrter verwende ich einen C-style for-Schleife. Ich könnte es auch tun, durch den Zugriff auf die Indizes via
${!arycopy[@]}
- und Rückwärtsfahren mittac
das ist eincat
, dreht sich um den line-Eingang um.Einer Funktion Lösung ohne variable Dereferenzierung würde wahrscheinlich umfassen
eval
die möglicherweise oder möglicherweise nicht sicher zu verwenden, in der situation (kann ich nicht sagen).InformationsquelleAutor der Antwort S.V.P.
Hier ist eine one-line-Lösung mit mapfile:
Beispiel:
Diese Methode ermöglicht eine große Flexibilität durch änderung/Austausch des grep-Befehls und hinterlässt keine leeren strings in dem array.
InformationsquelleAutor der Antwort Niklas Holm
In diesem ZSH ist tot einfach:
Ergebnisse:
InformationsquelleAutor der Antwort trevorj
Eigentlich, mir ist nur aufgefallen, dass die shell-syntax etwas hat ein Verhalten built-in ermöglicht eine einfache Rekonstruktion des Arrays, wenn, wie es stellte sich die Frage, ein Element entfernt werden soll.
Beachten Sie, wie wir konstruiert, das array mit Hilfe von bash s
x+=()
syntax?Könnte man tatsächlich fügen Sie mehr als ein Element mit, dass der Inhalt eine ganz andere Palette auf einmal.
InformationsquelleAutor der Antwort mar77i
http://wiki.bash-hackers.org/syntax/pe#substring_removal
Um eine vollständige element entfernen, müssen Sie eine unset-Befehl mit einer if-Anweisung. Wenn Sie don ' T Sorge über das entfernen von Präfixen von anderen Variablen oder über die Unterstützung Leerzeichen im array, dann können Sie einfach die Angebote und vergessen Sie for-Schleifen.
Siehe Beispiel unten für ein paar verschiedene Möglichkeiten, um aufzuräumen ein array.
Ausgabe
Hoffe, das hilft.
InformationsquelleAutor der Antwort phyatt
Mit
unset
Zum entfernen eines Elements an bestimmter index, den wir verwenden können
unset
tun, und dann kopieren zu einem anderen array. Nurunset
ist in diesem Fall nicht erforderlich. Daunset
nicht entfernen Sie das element, es stellt nur die null-string zu dem bestimmten index im array.Ausgabe
Mit
:<idx>
Können wir entfernen Sie einige Elemente mithilfe
:<idx>
auch. Zum Beispiel, wenn wir wollen, zu entfernen 1. element, das wir verwenden können:1
wie unten erwähnt.Ausgabe
InformationsquelleAutor der Antwort rashok
Was ich Tue, ist:
BAM, das Element wird entfernt.
InformationsquelleAutor der Antwort garfield
Dies ist eine quick-and-dirty-Lösung, die in einfachen Fällen, aber brechen, wenn (a) es gibt regex-Sonderzeichen in
$delete
oder (b) es gibt keine Leerzeichen bei allen Gegenständen. Beginnend mit:Löschen Sie alle Einträge, die genau passende
$delete
:was in
echo $array
-> pippo, und damit, dass es ein array:echo $array[1]
-> pippofmt
ist ein wenig verworren:fmt -1
wraps in der ersten Spalte (jedes Element auf einer eigenen Zeile. Das ist, wo das problem entsteht, mit der Elemente im Räume.)fmt -999999
packt Sie wieder zu einer Linie, die wieder die Leerzeichen zwischen den Elementen. Es gibt andere Möglichkeiten, das zu tun, wiexargs
.Nachtrag: Wenn Sie löschen möchten nur die erste übereinstimmung, sed benutzen, wie beschrieben hier:
InformationsquelleAutor der Antwort Joshua Goldberg
Wie wäre es mit etwas wie:
InformationsquelleAutor der Antwort user8223227
InformationsquelleAutor der Antwort Gombok Arthur