zsh 中的非贪婪(扩展)glob

zsh 中的非贪婪(扩展)glob

我喜欢做非贪婪的通配符,但我的谷歌搜索暗示这不受支持。是这样吗?如果是这样,为什么会这样呢?

例如,我想在历史扩展中使用非贪婪的 glob,例如^ff* ^open打开以前播放过的 mp3。

答案1

Zsh 没有非贪婪通配符。我能想到的唯一进行非贪婪匹配的地方是用参数替换形式${VAR#PATTERN}and剥离前缀时${VAR%PATTERN}(与贪婪匹配的${VAR##PATTERN}and相对)。${VAR%%PATTERN}

总是可以将使用非贪婪通配符的模式转换为不使用它们的模式,但转换可能会很痛苦,并且在最坏的情况下,结果的大小是原始大小的指数级。一个典型的非贪婪匹配会很方便的例子是,当您想要匹配一个数字范围后跟其他内容时,例如<1-42>*: this matches 43abecause <1-42>matches 4;解决方法是<1-42>([^0-9]*)#。根据您想要执行的操作,其他方法可能会更容易,例如安排使用前缀或后缀替换,或者从不同的角度解决问题。

对于您想要更改命令的历史扩展的用例,有一种不同的方法,它比您的示例短一个字符,并且在您的特定示例中更可靠。您可以使用而不是^ff* ^open匹配ff命令行上的任何位置并且仅在参数不包含空格时才有效

open !ff:*

它只匹配ff命令行的开头(!?ff将匹配任何地方)。

相关内容