> In addition to the following operations, the colon modifiers described in the section `Modifiers' in the section `History Expansion' can be applied: for example, ${i:s/foo/bar/} performs string substitution on the expansion of parameter $i. That's a very helpful snippet that I missed. Thanks. Sorry for the misinformation. On Mon, Feb 12, 2024 at 4:52 PM Lawrence Velázquez wrote: > On Mon, Feb 12, 2024, at 12:11 PM, Mark J. Reed wrote: > > Well, that was a shorter reply than I intended. But you should be able > > to see that the section you linked (14.1.4 Modifiers) is part of 14.1, > > History Expansion. Those modifiers don't apply to parameter > > substitution. > > They do. > > % var=foobar > % print -- $var:s/o/x > fxobar > > This is documented in zshexpn(1) under "Modifiers": > > After the optional word designator, you can add a sequence > of one or more of the following modifiers, each preceded > by a `:'. These modifiers also work on the result of > _filename generation_ and _parameter expansion_, except > where noted. > > and "PARAMETER EXPANSION": > > In addition to the following operations, the colon modifiers > described in the section `Modifiers' in the section `History > Expansion' can be applied: for example, ${i:s/foo/bar/} > performs string substitution on the expansion of parameter $i. > > > > For doing replacements with parameter expansion, you can just use the > > slash modifier. One / replaces the first occurrence, two //s does all > > of them: > > > >> *$ value=/dir/subdir/file.csv* > >> *$ echo ${value//dir/_G}* > >> */_G/sub_G/file.csv* > > > > That's not a zsh-specific feature; ksh and bash have it as well. Zsh > > likely has a different mechanism to accomplish the same thing, but I've > > not needed it so am not familiar with it. > > The :s and :gs history modifiers are similar but not exactly so. > Among other things, they perform literal searches by default, allow > referring to the matched text with "&", and apply nested expansions > differently. > > > >> On Mon, Feb 12, 2024 at 9:19 AM Joachim Ansorg > wrote: > >>> Hi, > >>> I was reading about modifiers on page > >>> https://zsh.sourceforge.io/Doc/Release/Expansion.html#Modifiers, > which says: > >>> > >>> > The forms ‘gs/l/r’ and ‘s/l/r/:G’ perform global substitution, > i.e. substitute every occurrence of r for l. Note that the g or :G must > appear in exactly the position shown. > >>> > >>> But zsh 5.9 doesn't seem to support this: > >>> > value="/dir/subdir/file.csv" > >>> > echo ${value:s/dir/_/:G} > >>> zsh: unrecognized modifier `G' > > It doesn't work on zsh 4.3.11 either, which means it hasn't worked > for at least 13 years. (This probably says something about the > prevalence of applying :s/l/r/:G to parameter expansions.) > > > >>> Is ":G" actually supported or is the documentation outdated here? > > I can't say for sure, but this feels like a bug to me. > > > -- > vq > -- Mark J. Reed