Ou, plus généralement, comment faire pour supprimer un élément à partir d'un colon liste séparée dans un environnement Bash variable?
Je pensais que j'avais vu un moyen simple de le faire il y a des années, à l'aide de la forme plus poussée de Bash extension variable, mais si j'ai perdu la trace. Une recherche rapide sur Google est en place étonnamment peu de résultats pertinents et aucun que je voudrais appeler "simple" ou "élégante". Par exemple, deux méthodes à l'aide de sed et awk, respectivement:
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)
N'a rien de simple, existe t-il? Est-il quelque chose d'analogue à un split() de la fonction en Bash?
Mise à jour:
Il semble que j'ai besoin de m'excuser pour mon intentionnellement vague question; j'étais moins intéressé par la résolution d'un précis de cas d'utilisation que de provoquer la discussion. Heureusement, je l'ai eu!
Il y a quelques très intelligent de techniques, mais il semble qu'il n'y a aucun moyen de le faire à l'aide de la pure script Bash (si nicerobot de l'IFS/tableau technique vient agréablement à proximité). En fin de compte, j'ai ajouté les trois fonctions suivantes de ma boîte à outils. La magie qui se passe dans path_remove, qui est basé en grande partie sur Martin York est une utilisation intelligente de l' awk
's variable RS.
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/:$//'`; }
Le seul réel les fichiers inutiles dans l'utilisation de l' sed
supprimer la fin du côlon. Compte tenu de la simplicité du reste de Martin solution est bien, je suis tout à fait prêt à vivre avec elle!
Question connexe: http://stackoverflow.com/questions/273909/how-do-i-manipulate-path-elements-in-shell-scripts