我经常在命令行上使用大括号扩展,因为它很方便。
例子
{foo,bar}
扩展到:
foo bar
多个大括号扩展也会扩展,例如:
{foo,bar}Q{foo,bar}
将扩展到:
fooQfoo fooQbar barQfoo barQbar
这是预期的行为,其中大括号扩展按顺序使用。
我的问题
现在,我希望任何大括号扩展(或其他短命令行技巧)的输出为:
fooQfoo barQbar
注意:我正在使用bash 3.2
答案1
我同意slm;我从未见过仅通过大括号扩展来做到这一点的方法。
但是,使用问题中的示例,我认为获得所需输出的最简单方法是使用循环,而不是大括号扩展和额外的后处理:
$ echo $(for X in foo bar;do echo ${X}Q${X};done)
fooQfoo barQbar
答案2
我不知道如何仅使用花括号来完成此操作。我也没有找到实现这一目标的方法,所以除非有人比我更聪明能找到一种方法,否则我会说这是不可能的。
作为备选
样本数据
$ tree
.
|-- dir1
| |-- file1
| `-- file2
`-- dir2
|-- file1
`-- file2
例子
$ seq 2 | xargs -i{} echo dir{}/file{}
dir1/file1
dir2/file2
可以将其放入这样的命令中:
$ echo $(seq 2 | xargs -i{} echo dir{}/file{})
dir1/file1 dir2/file2
或这个:
$ ls $(seq 2 | xargs -i{} echo dir{}/file{})
dir1/file1 dir2/file2
或这个:
$ ls -l $(seq 2 | xargs -i{} echo dir{}/file{})
-rw-rw-r-- 1 saml saml 0 Sep 2 03:18 dir1/file1
-rw-rw-r-- 1 saml saml 0 Sep 2 03:31 dir2/file2
为什么花括号不能做到这一点
如果你看看你原来的例子:
{foo,bar}Q{foo,bar}
其扩展方式如下:
fooQfoo fooQbar barQfoo barQbar
扩展这一机制的机制称为笛卡尔积。
例如:
$ echo {A,B}{X,Y,Z}
AX AY AZ BX BY BZ
或这个:
$ echo {M,N}-{A,B}{X,Y,Z}
M-AX M-AY M-AZ M-BX M-BY M-BZ N-AX N-AY N-AZ N-BX N-BY N-BZ
无法创建会导致以下结果的笛卡尔积:
fooQfoo barQbar
你唯一的选择是要么诉诸诸如此类的诡计:
$ echo dir{1,2}/file{2,1}
dir1/file2 dir1/file1 dir2/file2 dir2/file1
然后将其放入 Bash 数组中:
$ a=(dir{1,2}/file{2,1})
$ echo ${a[@]:1:2}
dir1/file1 dir2/file2
另一种选择是某种“其他方法”,例如我之前在上面讨论过的方法(使用xargs
)。