Oder allgemeiner: Wie entferne ich ein Element aus einer durch Doppelpunkte getrennten Liste in einer Bash-Umgebungsvariablen?
Ich dachte, ich hätte vor Jahren einen einfachen Weg gesehen, dies mit den fortgeschritteneren Formen der Bash-Variablenerweiterung zu tun, aber wenn ja, habe ich den Überblick verloren. Eine schnelle Suche bei Google ergab überraschend wenige relevante Ergebnisse und keine, die ich als "einfach" oder "elegant" bezeichnen würde. Zum Beispiel zwei Methoden mit sed bzw. awk:
PATH=$(echo $PATH | sed -e 's;:\?/home/user/bin;;' -e 's;/home/user/bin:\?;;')
PATH=!(awk -F: '{for(i=1;i<=NF;i++){if(!($i in a)){a[$i];printf s$i;s=":"}}}'<<<$PATH)
Gibt es nichts Unkompliziertes? Gibt es etwas Analoges zu einer split () - Funktion in Bash?
Update:
Es sieht so aus, als müsste ich mich für meine absichtlich vage Frage entschuldigen. Ich war weniger daran interessiert, einen bestimmten Anwendungsfall zu lösen, als eine gute Diskussion anzuregen. Zum Glück habe ich es verstanden!
Hier gibt es einige sehr clevere Techniken. Am Ende habe ich meiner Toolbox die folgenden drei Funktionen hinzugefügt. Die Magie geschieht in path_remove, das weitgehend auf Martin Yorks kluger Verwendung der awk
RS-Variablen basiert .
path_append () { path_remove $1; export PATH="$PATH:$1"; }
path_prepend () { path_remove $1; export PATH="$1:$PATH"; }
path_remove () { export PATH=`echo -n $PATH | awk -v RS=: -v ORS=: '$0 != "'$1'"' | sed 's/:$//'`; }
Die einzige echte Kruft darin ist die Verwendung sed
, um den hinteren Doppelpunkt zu entfernen. Wenn man bedenkt, wie einfach der Rest von Martins Lösung ist, bin ich durchaus bereit, damit zu leben!
Verwandte Frage: Wie manipuliere ich $ PATH-Elemente in Shell-Skripten?
WORK=`echo -n ${1} | awk -v RS=: -v ORS=: '$0 != "'${3}'"' | sed 's/:$//'`; eval "export ${2}=${WORK}"
aber Sie müssen es nennenfunc $VAR VAR pattern
(basierend auf @ martin-york und @ andrew-aylett)