击:为什么回声增加额外的空间?

问题描述 投票:9回答:7

我得到:

$ 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

bash syntax echo
7个回答
2
投票

最简单的和最干净的解决方案是一个退格添加到每一行的前:

echo -e -n "\bD"{a,b,c}".jpg\n"

这将产生所需的输出。


10
投票

使用更轻便的printf

$ printf "D%s.jpg\n" {a,b,c}
Da.jpg
Db.jpg
Dc.jpg

10
投票

因为这是括号扩展做什么。从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

4
投票

echo总是添加参数之间的空间。没有\n试试你的命令,并比较结果。


2
投票

您可以通过使用xargs的由第一回波吐参数分成每一条线得到想要的效果:

$ echo "D"{a,b,c}".jpg" | xargs -n1 echo
Da.jpg
Db.jpg
Dc.jpg

2
投票

您可以通过在前面加上一个空得到一个更一致的外观:

$ echo -en "" "D"{a..c}".jpg\n"
 Da.jpg
 Db.jpg
 Dc.jpg

现在,他们都有一个额外的空间。此外,使用-n消除在年底额外的换行符。此外,您还可以在括号扩展使用范围。


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
© www.soinside.com 2019 - 2024. All rights reserved.