我会将此作为评论添加到罗伯特的回答中,但我没有 50 名声望。然而。(提示:你可以帮助解决这个问题!;-)
我是 csh 用户(不是自愿),因此非常感谢罗伯特的回答。但是使用的正则表达式容易匹配部分路径元素,例如 if LD_LIBRARY_PATH = path1:mypath:path2:path3:path4
, then ...
setenv LD_LIBRARY_PATH `echo $LD_LIBRARY_PATH | perl -pe "s[/ath][]g;"`
...会产生LD_LIBRARY_PATH = p1:my:p2:p3:p4
基于 robert 的回答,我修改了正则表达式以确保仅匹配路径字符串中的完整元素,并进行多次替换以处理 DIR_TO_REMOVE 发生在路径开头、中间或结尾的情况。我还添加了一个替换来清理前导冒号(或路径只有“:”)和双冒号(“::”)。我无法弄清楚如何安全地删除尾随冒号,因为 csh 解析器在处理$
作为 EOF 的元字符(或字符串结尾,在这种情况下)时很痛苦。(见 http://www.grymoire.com/Unix/CshTop10.txt)
我已将此实现为接受命令行参数的 csh 别名,因为我想将它与 PATH、LD_LIBRARY_PATH 等一起使用。第一个参数是要修改的路径变量的名称。第二个参数是要替换的路径元素,第三个参数是新的路径元素(或“”以简单地删除与第二个参数匹配的路径元素)。
我知道沃尔特的问题是如何删除路径,但由于删除实际上只是用空值替换,这仍然回答了这个问题。为了我自己的使用,我安装了不同的工具链(例如,GCC 4.1.2、GCC 4.8.1、ICPC 2013)并且需要轻松地换入/换出路径到适当的二进制文件、库和包含给定的工具链,但对构建管理系统保持透明。
这是代码:
alias repath 'setenv \!:1 `echo $\!:1\: | perl -pe "s[^\!:2\:][\!:3\:]g; s[\:\!:2\:][\:\!:3\:]g; s[\:\:][\:]g; s[^\:][]g;"` '
在 csh 终端会话中安全地对其进行测试,如下所示:
setenv myTestPath /myLDpath
setenv myTestPath2 /myLDpath/x86_64
setenv myTestPath3 /myLDpathDebug
setenv testPATH /SOME/PATH:/SOME/OTHER/PATH:${myTestPath}:${myTestPath2}:${myTestPath3}
echo " Starting with the following path-variable content ..."
printenv testPATH
echo " Remove $myTestPath from the middle ..."
repath testPATH $myTestPath ""
printenv testPATH
echo " Put $myTestPath at the beginning ..."
setenv testPATH ${myTestPath}:/SOME/PATH:/SOME/OTHER/PATH:${myTestPath2}:${myTestPath3}
printenv testPATH
echo " and remove it from the beginning ..."
repath testPATH $myTestPath ""
printenv testPATH
echo " Put $myTestPath at the end ..."
setenv testPATH /SOME/PATH:/SOME/OTHER/PATH:${myTestPath3}:${myTestPath2}:${myTestPath}
printenv testPATH
echo " and remove it from the end ..."
repath testPATH $myTestPath ""
printenv testPATH
echo " Replace $myTestPath3 with /myLDpath/Debug ..."
repath testPATH $myTestPath3 "/myLDpath/Debug"
printenv testPATH
echo " Done!"