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