我有setopt extended_glob
,我想排除~/.config/zsh
以 或_
文件名completion.zsh
或开头的所有文件options.zsh
我有这个命令:
for f (${${(%):-%x}:P:h:h}/**/([^_|^completion|^options])*.zsh) print $f
它完成了这项工作,但上面的命令也排除了lazyload.zsh
,为什么上面的命令排除这个模式?我预计它会打印出来lazyload.zsh
。
答案1
只是:
${${(%):-%x}:P:h:h}/**/(^(_|completion|options)*).zsh
^
是extendedglob
否定运算符。
记住[anything]
只匹配一个字符1。
[a|b]
匹配a
,|
或b
,匹配除,或 之外的[^a|b]
任何字符。a
|
b
因此,您的模式排除了,lazyload.zsh
因为它位于单字符匹配运算符l
排除的字符列表中。[^...]
¹ (在zsh
; 在某些其他 shell 中,它还可能匹配某些语言环境中的多字符整理元素;zsh[...]
还可以匹配不构成有效字符部分的字节,YMMV 与其他 shell)