Bash从路径变量和sed命令中删除路径

时间:2013-01-02 15:25:42

标签: bash path awk export

使用此代码

What is the most elegant way to remove a path from the $PATH variable in Bash?

export PATH=`echo ${PATH} | awk -v RS=: -v ORS=: '/SDE/ {next} {print}'` | sed 's/:*$//'

在这种情况下,如果我只运行:

export PATH=`echo ${PATH} | awk -v RS=: -v ORS=: '/SDE/ {next} {print}'`

我可以删除包含/SDE/的路径;但是:仍然存在。我假设后的sed命令应删除它。当我立即运行整个命令时根本没有任何东西被删除。导致路径不更新的sed语句有什么问题?如何删除sed路径变量后:命令删除冒号/SDE/

3 个答案:

答案 0 :(得分:2)

问题是在命令中放置关闭后引用`

export PATH=`echo ${PATH} | awk -v RS=: -v ORS=: '/SDE/ {next} {print}'` | sed 's/:*$//'

如果您使用了推荐的$(...)表示法,则会发现这相当于:

export PATH=$(echo ${PATH} | awk -v RS=: -v ORS=: '/SDE/ {next} {print}') | sed 's/:*$//'

export操作的输出传递给sed,但export是静默的。

使用:

export PATH=$(echo ${PATH} | awk -v RS=: -v ORS=: '/SDE/ {next} {print}' | sed 's/:*$//')

我已经修复了answer,从中逐字复制了错误的命令。正如tripleee在评论中所指出的那样,我并不完全相信awk解决方案,但问题是“代码出了什么问题”,答案是“放置后引号的位置” ”。 awk脚本确实处理PATH中任何位置的PATH元素; sed脚本只是确保没有尾随:,因此在PATH末尾没有隐式使用当前目录。

另请参阅:How do I manipulate PATH elements in shell scriptsHow to keep from duplicating PATH variable in csh上的clnpath脚本 - 该脚本适用于Bourne,Korn,Bash shell之类的POSIX-shell,尽管有问题的主题。 clnpath与此处使用的符号之间的一个区别是clnpath仅删除完整路径名;它不会尝试进行部分路径元素匹配:

export PATH=$(clnpath $PATH /opt/SDE/bin)

如果要删除的路径元素是/opt/SDE/bin。请注意,clnpath可用于维护LD_LIBRARY_PATHCDPATHMANPATH以及任何其他类似路径的变量;当然,awk调用也可以。

我顺便提一下,/SDE/脚本中的awk模式会删除/opt/USDER/bin;正则表达式中的斜杠与路径名中的斜杠无关。

答案 1 :(得分:0)

$ PATH="$( awk -v rmv="/SDE/" -v path="$PATH" 'BEGIN{sub(rmv,"",path); gsub(/:+/,":",path); print path}' )"

以上是猜测,因为你没有提供样本输入或预期输出,所以它可能不是你想要的,但这是正确的方法。

答案 2 :(得分:0)

就在bash:

tmp=":$PATH"
[[ $tmp =~ :[^:]*/SDE/[^:]* ]] && tmp=${tmp/${BASH_REMATCH[0]}/}
PATH=${tmp#:}