Brace expansion
Joshua Judson Rosen
rozzin at geekspace.com
Sat Sep 22 10:13:10 EDT 2012
I woke up after seeing this in a dream, this morning:
echo -e 'e\nw' | xargs -I%h bash -c \
"echo -e 'n\ns' | xargs -I%v bash -c \"seq 1 100 \
| xargs -I%y bash -c \\\"seq 1 100 \
| xargs -I%x echo '%y%v%x%h'\\\"\"" \
| xargs -i wget 'http://imgs.xkcd.com/clickdrag/{}.png'
Thanks, guys :p
Ben Scott <dragonhawk at gmail.com> writes:
>
> On Fri, Sep 21, 2012 at 11:32 AM, Ben Scott <dragonhawk at gmail.com> wrote:
> > I use brace expansion *all the time*. It's very handy for
> > manipulating groups of files with similar names.
>
> To expand[[1] on this a bit, for those who aren't familiar with it:
>
> Brace expansion is a little bit like glob pattern expansion, in that
> it replaces words in a command line with a larger number of words[2],
> and then processes the resulting expanded command line. But unlike
> glob pattern expansion, it doesn't match file names, it just generates
> strings from a pattern.
>
> A construct of the form
>
> ding{for,bar,baz}dong
>
> will be expanded to
>
> dingfoodong dingbardong dingbazdong
>
> by the shell[3]. So one can do something like
>
> mv foo.{c,h,o} ../bar/
>
> One can also specify sequences. This
>
> X{a..c}Y
>
> expands to
>
> XaY XbY XcY
>
> and this
>
> a{3..6}b
>
> expands to
>
> a3b 346 a5b
>
> Multiple brace expansions in the same word will multiply. Separate
> words are expanded separately. So this
>
> X{a..c}Y A{1..3}B
>
> expands to this
>
> XaY XbY XcY A1B A2B A3B
>
> while this
>
> X{a..c}Y{1..3}Z
>
> expands to
>
> XaY1Z XaY2Z XaY3Z XbY1Z XbY2Z XbY3Z XcY1Z XcY2Z XcY3Z
>
> As Mr. Alan Johnson points it, it's functionally equivalent to a
> "for foo in ... " construct, optionally combined the seq(1) command,
> but it's much more concise to type or read, and it's often faster.
>
> Brace expansion is also available in some other contexts. Mr. Rosen
> provides the tip that curl(1) will expand braces internally. This
> should be faster still than doing it in the shell, and can solve
> problems with unreasonably long command lines. One has to escape the
> braces to prevent the shell from expanding them:
>
> curl 'http://www.example.com/{foo,bar}.png'
>
> If one left out the quotes, the shell would expand it to:
>
> curl http://www.example.com/foo.png http://www.example.com/bar.png
>
> which would still work for this example, but not when there are
> 256^2*4 expansions. :)
>
> -- Ben
>
> [1] I swear this pun wasn't intended.
> [2] Technically speaking, it could also expand to the same number, for
> degenerate cases.
> [3] Well, Bash, at least, and I think some others.
> _______________________________________________
> gnhlug-discuss mailing list
> gnhlug-discuss at mail.gnhlug.org
> http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss/
>
--
"Don't be afraid to ask (λf.((λx.xx) (λr.f(rr))))."
More information about the gnhlug-discuss
mailing list