为了简单起见,请考虑以下任务:
给定一个非空的shell变量var
,我们知道最后一个字符是字母a
,并且至少有一个字符不是a
,请删除变量右侧的所有a
。
示例:如果变量最初包含 abcadeaaa ,则之后应包含 abcade 。
我想知道这是否可以在Zsh中以紧凑的方式完成。
当然,使用外部程序(例如sed
)或使用 while 循环时,这是微不足道的,我们连续剥离最后a
( ${VAR%a}
),直到变量的值不再变化。两者都可以在POSIX shell,bash或ksh中工作。但是,鉴于Zsh有很多很好的扩展功能,我想知道,是否有更好的方法。
问题是匹配某个特定字符(独立的长度)的运行会对正则表达式产生影响,但参数扩展中%
之后的模式以及s///
替换中的模式,两者都是一个通配符模式,它不允许我做我想做的事 - 至少根据我对 zshexpn 手册页的理解。
对此有何想法?
请注意,这个问题不是为了解决现实世界的问题(在这种情况下,我只是会使用sed
来完成工作,因为这样可以完成工作),但更多的是出于学术兴趣,找出我们可以扩展Zsh扩展机制的极限。