Entonces, combinando las respuestas de @gilles y @ bruno-a (y un par de otros trucos de sed) se me ocurrió este one-liner, que eliminará (cada) REMOVE_PART de PATH, independientemente de si ocurre al principio, medio o final de la RUTA
PATH=$(REMOVE_PART="/d/Programme/cygwin/bin" sh -c 'echo ":$PATH:" | sed "s@:$REMOVE_PART:@:@g;s@^:\(.*\):\$@\1@"')
Es un poco difícil de manejar, pero es bueno poder hacerlo de un solo golpe. El ;
se utiliza para unir los dos comandos sed separados:
s@:$REMOVE_PART:@:@g
(que reemplaza :$REMOVE_PART:
con una sola :
)
s@^:\(.*\):\$@\1@
(que elimina los dos puntos iniciales y finales que agregamos con el comando echo)
Y a lo largo de líneas similares, acabo de llegar a esta línea para agregar un ADD_PART a la RUTA, solo si la RUTA aún no lo contiene
PATH=$(ADD_PART="/d/Programme/cygwin/bin" sh -c 'if echo ":$PATH:" | grep -q ":$ADD_PART:"; then echo "$PATH"; else echo "$ADD_PART:$PATH"; fi')
Cambie la última parte a echo "$PATH:$ADD_PART"
si desea agregar ADD_PART al final de PATH en lugar de al inicio.
...
... o para hacer esto aún más fácil, cree un script llamado remove_path_part
con el contenido
echo ":$PATH:" | sed "s@:$1:@:@g;s@^:\(.*\):\$@\1@"
y un script llamado prepend_path_part
con el contenido
if echo ":$PATH:" | grep -q ":$1:"; then echo "$PATH"; else echo "$1:$PATH"; fi
y un script llamado append_path_part
con el contenido
if echo ":$PATH:" | grep -q ":$1:"; then echo "$PATH"; else echo "$PATH:$1"; fi
hacerlos todos ejecutables y luego llamarlos como:
PATH=$(remove_path_part /d/Programme/cygwin/bin)
PATH=$(prepend_path_part /d/Programme/cygwin/bin)
PATH=$(append_path_part /d/Programme/cygwin/bin)
Genial, incluso si lo digo yo mismo :-)