或者更一般地说,如何从 Bash 环境变量中以冒号分隔的列表中删除项目?
我以为我在几年前看到了一种简单的方法,使用更高级的 Bash 变量扩展形式,但如果是这样,我已经忘记了它。对 Google 的快速搜索结果出乎意料地少,而且没有一个我称之为“简单”或“优雅”的结果。例如,分别使用 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
's 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 的解决方案的其余部分是多么简单,我非常愿意接受它!