Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Questions from zshexpn(1) -- Globbing



On Mon, 2019-11-18 at 18:53 -0600, Perry Smith wrote:
> The subsection is Globbing Flags within Filename Generation with both
> the b and m flags is a curious phrase:
>
>> Activate backreferences for parenthesised groups in the pattern;
>> this does not work in filename generation. 
> Why does it say “this does not work in filename generation” ?  Using
> their example for the m flag: 
> 
>>           arr=(veldt jynx grimps waqf zho buck)
>>           print ${arr//(#m)[aeiou]/${(U)MATCH}}
> I can change the “print” to “touch” and it touches the files and
> change it to “rm” and it removes the files. 
> 
> My fear here is that I’m missing something rather significant such as
> what precisely is “filename generation”

You're using that feature in variable substitution, not filename
generation.

Filename generation is specifically the use of pattern characters *, ?,
etc. to generate file names.  So what this means is that the patterns
generated by that method aren't available for use in what I called
backreferences (that's a bad name, sorry: when used in regular
expressions, its standard meaning is references back to a previous part
of the same pattern, which isn't what's happening here).

So if instead of using the array you matched the files directly,
having created them:

    touch $arr
    print (#m)*([aeiou])*

you'd have no way of using the references generated because the file
names are substituted before the $MATCH variable would be available ---
which is probably obvious.

Of course, even if you needed to match the files on the disk first you
could still do

    arr=(*)
    print ${arr//(#m)[aeiou]/${(U)MATCH}}

so you've still got the ability to change the file names with variable
substitution.

So this is probably saying less than you think it is.

pws



Messages sorted by: Reverse Date, Date, Thread, Author