或者更一般地说,如何从 Bash 环境变量的冒号分隔列表中删除某个项目?
几年前,我想我已经看到了一种简单的方法,使用更高级的 Bash 变量展开形式,但如果是这样的话,我已经失去了它的踪迹。在谷歌上快速搜索一下,出人意料地几乎没有相关的结果,也没有我称之为“简单”或“优雅”的结果。例如,分别使用 sed 和 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)
是否没有直接的东西存在? 是否有类似于 Bash 中的 split ()函数?
更新:
看起来我需要为我故意模糊的问题道歉; 我对解决特定用例的兴趣不如对引发良好讨论的兴趣。幸运的是,我拿到了!
这里有一些非常聪明的技巧。最后,我在工具箱中添加了以下三个函数。奇迹发生在 path _ remove 中,这主要是基于 Martin York 对 awk
的 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/:$//'`; }
唯一真正的障碍是使用 sed
去除尾随的结肠。不过,考虑到 Martin 剩下的解决方案是多么简单,我还是很愿意接受它!
相关问题: 如何操作 shell 脚本中的 $PATH 元素