ZSH 中的嵌套替换

ZSH 中的嵌套替换

我用zsh

比如说,我想从 中删除当前目录cdpath。这意味着我需要根据内容删除一个元素,这很符合模式${name:#to_be_removed}。但有一个问题:to_be_removed是替换的结果(即$(pwd)/)。我该如何优雅地实现这一点?我做到的最好的方法是:

cdpath=("${(s/ /)$(eval echo $(echo "\${(@)cdpath:#${$(pwd)}/}"))}")

这对我来说是一个常见的用例,大量这种 *SH 混乱的情况开始让我感到烦躁……

谢谢,PythonNut

答案1

如果你想从$cdpath数组中删除当前目录,我只需使用

cdpath=(${cdpath/(#s)$PWD(#e)})

(#s)与“普通”正则表达式中的“和”(#e)起着相同的作用,即字符串的开始和结束。^$请注意:这些都需要setopt EXTENDED_GLOB工作!

如果你需要外部命令,

cdpath=(${cdpath/(#s)${$(some_command)}})

应该管用。

测试用例:

$ setopt EXTENDED_GLOB
$ cdpath=(/foo /foo/bar /bar)
$ pwd
/bar
$ cdpath=(${cdpath/(#s)${$(builtin pwd)}})
$ print -l $cdpath
/foo
/foo/bar

相关内容