我明白了:
$ echo -e "D"{a,b,c}".jpg\n"
Da.jpg
Db.jpg
Dc.jpg
注意:输出的第2行和第3行的Db和Dc之前的额外空格。
为什么会出现这些?
谢谢, 丹
编辑:由于我的实际目标中有空格(我本应该写的):
echo -e "Name"{,.}" "{-,}"extra"{,so}" 5v5 "{one,two,No\ four}{,!,\!\!}"\n"
这里的大多数解决方案对我都不起作用(for loop,xarg,tr)。由于我想要使用cantesian产品进行多次括号扩展,Printf无法正常工作。
我结合了3个解决方案(mletterle的\ b,Dennis Williamson的额外空间,以及Jim Dennis的使用少得多的报价)来获得:
echo -e "" \\bName{,.}\ {-,}extra{,so}\ 5v5\ {one,two,No\ four}{,\!,\!\!}\\n
感谢所有回答的人!我从你的回答中学到了很多东西!
丹
答案 0 :(得分:10)
因为这就是大括号扩展的作用。来自man bash
,标题为Brace expansion
:
要扩展的模式采取 形式的 可选的序言,后跟......一系列逗号分隔 字符串......后跟可选项 后记。序言是前缀的 到包含在其中的每个字符串 大括号,然后将postscript附加到每个结果 字符串,从左向右扩展 例如,{d,c,b} e扩展为 'ade ace abe'
所以在你的例子中,“D”是序言,“.jpg \ n”是后记。
因此,在支撑扩张发生后,您将离开:
echo -e Da.jpg\n Db.jpg\n Dc.jpg\n
作为hewgill points out,shell然后将其分成三个标记并将它们传递给echo;输出由空格分隔的每个标记。要获得所需的输出,您需要使用此处的许多建议之一,这些建议不会在令牌之间重新插入不需要的空间。
这样做的时间更长,可能不是最好的方法,但是以下内容给出了你想要的输出:
for file in "D"{a,b,c}".jpg"
do
echo ${file}
done
答案 1 :(得分:10)
使用更便携的printf
$ printf "D%s.jpg\n" {a,b,c}
Da.jpg
Db.jpg
Dc.jpg
答案 2 :(得分:4)
echo
总是在参数之间添加空格。尝试不使用\n
的命令并比较结果。
答案 3 :(得分:2)
你可以通过使用xargs将第一个echo的参数spit分成一行来获得所需的效果:
$ echo "D"{a,b,c}".jpg" | xargs -n1 echo
Da.jpg
Db.jpg
Dc.jpg
答案 4 :(得分:2)
最简单,最干净的解决方案是在每行的前面添加退格:
echo -e -n "\bD"{a,b,c}".jpg\n"
这会产生所需的输出。
答案 5 :(得分:2)
通过添加null:
,可以获得更一致的外观$ echo -en "" "D"{a..c}".jpg\n"
Da.jpg
Db.jpg
Dc.jpg
现在他们都有一个额外的空间。此外,使用-n
消除了最后的额外换行符。此外,您可以在大括号扩展中使用范围。
答案 6 :(得分:0)
以下是使用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