我明白了:
$ echo -e "D"{a,b,c}".jpg\n"
Da.jpg
Db.jpg
Dc.jpg
Run Code Online (Sandbox Code Playgroud)
注意:输出的第2行和第3行上的Db和Dc之前的额外空格.
这些为什么?
谢谢,丹
编辑:因为我的实际目标中有空格(我本应该写的):
echo -e "Name"{,.}" "{-,}"extra"{,so}" 5v5 "{one,two,No\ four}{,!,\!\!}"\n"
Run Code Online (Sandbox Code Playgroud)
这里的大多数解决方案对我都不起作用(for loop,xarg,tr).Printf没有工作,因为我想要cantesian产品的多个括号扩展.
我结合了3个解决方案(mletterle的\ b,Dennis Williamson的额外空间,以及Jim Dennis的使用少得多的报价)来得到:
echo -e "" \\bName{,.}\ {-,}extra{,so}\ 5v5\ {one,two,No\ four}{,\!,\!\!}\\n
Run Code Online (Sandbox Code Playgroud)
谢谢所有回答的人!我从你的回答中学到了很多东西!
担
Jam*_*ley 10
因为这就是大括号扩展的作用.从man bash
标题下方Brace expansion
:
要扩展的模式采用可选前导码的形式,后跟...一系列以逗号分隔的字符串......后跟可选的postscript.前导码以大括号中包含的每个字符串为前缀,然后将postscript附加到每个结果字符串,从左向右扩展例如,{d,c,b} e扩展为"ade ace abe"
所以在你的例子中,"D"是序言,".jpg \n"是后记.
因此,在支撑扩展发生后,您将离开:
echo -e Da.jpg\n Db.jpg\n Dc.jpg\n
正如赫威尔指出的那样,贝壳然后将它分成三个标记并将它们传递给回声; 输出由空格分隔的每个标记.要获得所需的输出,您需要使用此处的许多建议之一,这些建议不会在标记之间重新插入不需要的空间.
它更长,可能不是最好的方法,但是下面给出了你想要的输出:
for file in "D"{a,b,c}".jpg"
do
echo ${file}
done
Run Code Online (Sandbox Code Playgroud)
gho*_*g74 10
使用更便携的printf
$ printf "D%s.jpg\n" {a,b,c}
Da.jpg
Db.jpg
Dc.jpg
Run Code Online (Sandbox Code Playgroud)
echo
总是在参数之间添加空格。试试你的命令\n
并比较结果。
最简单、最干净的解决方案是在每行前面添加一个退格键:
echo -e -n "\bD"{a,b,c}".jpg\n"
Run Code Online (Sandbox Code Playgroud)
这会产生所需的输出。