Re: alternation option end of string

Roman Perepelitsa <[email protected]> Sat, 2 May 2026 11:47:59 +0200
Newsgroups gmane.comp.shells.zsh.devel,gmane.comp.shells.zsh.user
Message-ID <CAN=4vMpz9buom+J_qcyv61X8BVV5CYZvb2qQuhyu6QNdg=VYnw@mail.gmail.com>
On Sat, May 2, 2026 at 6:45 AM Ray Andrews <[email protected]> wrote:

>
> I want 'cat' to print but only if it has nothing following it except 's'
> in which case  'cats' will print irrespective of following characters.
> So 'cat' and 'cats' are the only outputs and
> 'catz' will print nothing but 'catszzzzz' will print 'cats'.  At the
> moment I'm doing this with two sequential tests and it works fine, but
> I'm wondering if they can be combined.
>

This should do it, if I understood your requirements correctly:

${${(M)string:#cat(|s*)}[1,4]}

The first expansion leaves cat(|s*) intact (cat, cats, catsz, catszz, etc.)
and turns everything else into nul. The second expansion extracts the first
4 characters, effectively dropping any potential suffix after cats.

Another option would be to capture the interesting part of the match
explicitly (requires extended_glob):

[[ $string == (#b)((cat)|(cats)*) ]] && out=$match[2]$match[3] || out=

Roman