Bash:为什么echo会增加额外的空间?

时间:2010-01-05 01:19:25

标签: bash syntax echo

我明白了:

$ 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

感谢所有回答的人!我从你的回答中学到了很多东西!

7 个答案:

答案 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