Ou plus généralement, comment supprimer un élément d'une liste séparée par deux-points dans une variable d'environnement Bash?
Je pensais avoir vu un moyen simple de le faire il y a des années, en utilisant les formes plus avancées d'expansion variable de Bash, mais si c'est le cas, j'en ai perdu la trace. Une recherche rapide sur Google a produit étonnamment peu de résultats pertinents et aucun que j'appellerais «simple» ou «élégant». Par exemple, deux méthodes utilisant respectivement sed et 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)
N'existe-t-il rien de simple? Y a-t-il quelque chose d'analogue à une fonction split () dans Bash?
Mise à jour:
il semble que je doive m'excuser pour ma question intentionnellement vague; J'étais moins intéressé à résoudre un cas d'utilisation spécifique qu'à provoquer une bonne discussion. Heureusement, je l'ai!
Il existe ici des techniques très intelligentes. En fin de compte, j'ai ajouté les trois fonctions suivantes à ma boîte à outils. La magie opère dans path_remove, qui repose en grande partie sur l'utilisation intelligente par Martin York de la awk
variable RS de 's.
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 vrai problème ici est l'utilisation de sed
pour supprimer les deux points de fin. Compte tenu de la simplicité du reste de la solution de Martin, je suis tout à fait disposé à vivre avec!
Question connexe: Comment manipuler les éléments $ PATH dans les scripts shell?
WORK=`echo -n ${1} | awk -v RS=: -v ORS=: '$0 != "'${3}'"' | sed 's/:$//'`; eval "export ${2}=${WORK}"
mais vous devez l'appeler commefunc $VAR VAR pattern
(basé sur @ martin-york et @ andrew-aylett)