或者更一般地说,如何从 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() 函数的东西?
Update:
看来我需要为我故意含糊的问题道歉;我对解决特定用例更感兴趣,而不是引发良好的讨论。幸运的是,我得到了!
这里有一些非常聪明的技巧。最后,我将以下三个函数添加到我的工具箱中。神奇的事情发生在 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 元素?
我的肮脏黑客:
echo ${PATH} > t1
vi t1
export PATH=$(cat t1)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)