或更笼统地说,如何从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
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
来删除尾随的冒号。考虑到马丁解决方案的其余部分是多么简单,我很愿意接受它!
相关问题: 如何在Shell脚本中操作$ PATH元素?
WORK=`echo -n ${1} | awk -v RS=: -v ORS=: '$0 != "'${3}'"' | sed 's/:$//'`; eval "export ${2}=${WORK}"
但您必须将其称为func $VAR VAR pattern
(基于@ martin-york和@ andrew-aylett)