我得到:
$ echo -e "D"{a,b,c}".jpg\n"
Da.jpg
Db.jpg
Dc.jpg
注:DB和DC之前多余的空格在输出的第2和第3行。
为什么这些呢?
谢谢,丹
编辑:既然我的实际目标有在它的空间(这是我应该最初写):
echo -e "Name"{,.}" "{-,}"extra"{,so}" 5v5 "{one,two,No\ four}{,!,\!\!}"\n"
大多数解决方案在这里并没有为我工作(for循环,xarg,TR)。 printf的没有,因为我想cantesian产品的多个括号扩展的工作。
我结合3个解决方案(mletterle的\ B,丹尼斯·威廉姆森的额外的空间,和吉姆丹尼斯的使用远不如引号),以获得:
echo -e "" \\bName{,.}\ {-,}extra{,so}\ 5v5\ {one,two,No\ four}{,\!,\!\!}\\n
感谢所有谁回答!我学到了很多东西,从你的回答!
Dan
最简单的和最干净的解决方案是一个退格添加到每一行的前:
echo -e -n "\bD"{a,b,c}".jpg\n"
这将产生所需的输出。
使用更轻便的printf
$ printf "D%s.jpg\n" {a,b,c}
Da.jpg
Db.jpg
Dc.jpg
因为这是括号扩展做什么。从man bash
,在标题Brace expansion
:
模式是梅开二度扩大了一个可选的序言的形式,然后......一系列以逗号分隔的字符串...后跟一个可选的PostScript。前同步码被前缀到包含在括号内的每个字符串,然后附言被附加到每个生成的字符串,扩大左到右例如,{d,C,B}È扩展为“ADE王牌ABE”
因此,在你的榜样,“d”是序言和“.JPG \ n”的后记。
因此,括号展开发生后,你留下要:
echo -e Da.jpg\n Db.jpg\n Dc.jpg\n
如hewgill points out,外壳然后分裂成这三个令牌,并将它们传递到回声;其输出由空格分隔每个令牌。为了得到你想要的输出,你需要使用这里的许多建议,不要再插入标记之间的不必要的空间之一。
它的长,可能不会做到这一点的最巧妙的方法,但下面给你后的输出:
for file in "D"{a,b,c}".jpg"
do
echo ${file}
done
echo
总是添加参数之间的空间。没有\n
试试你的命令,并比较结果。
您可以通过使用xargs的由第一回波吐参数分成每一条线得到想要的效果:
$ echo "D"{a,b,c}".jpg" | xargs -n1 echo
Da.jpg
Db.jpg
Dc.jpg
您可以通过在前面加上一个空得到一个更一致的外观:
$ echo -en "" "D"{a..c}".jpg\n"
Da.jpg
Db.jpg
Dc.jpg
现在,他们都有一个额外的空间。此外,使用-n
消除在年底额外的换行符。此外,您还可以在括号扩展使用范围。
下面是一个使用溶液sed
(即建立在https://stackoverflow.com/a/2003856/8180143):
$ echo -en "" "D"{a..c}".jpg\n" | sed 's/ //'
Da.jpg
Db.jpg
Dc.jpg
该解决方案具有与具有输入空间,例如工作的优点,
$ echo -en "" "D "{a..c}".jpg\n" | sed 's/ //'
D a.jpg
D b.jpg
D c.jpg