代码之家  ›  专栏  ›  技术社区  ›  Dan

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

  •  9
  • Dan  · 技术社区  · 16 年前

    我得到:

    $ 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"
    

    这里的大多数解决方案都不适合我(对于Loop、Xarg和Tr)。printf不起作用,因为有多个支架扩展,我想Cantesian产品。

    我结合了3个解决方案(mletterle的\b、丹尼斯威廉姆森的额外空间和吉姆丹尼斯使用的报价少得多),得出:

    echo -e "" \\bName{,.}\ {-,}extra{,so}\ 5v5\ {one,two,No\ four}{,\!,\!\!}\\n
    

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

    丹

    7 回复  |  直到 16 年前
        1
  •  2
  •   mletterle    16 年前

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

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

    这将产生所需的输出。

        2
  •  10
  •   ghostdog74    16 年前

    使用更便携的printf

    $ printf "D%s.jpg\n" {a,b,c}
    Da.jpg
    Db.jpg
    Dc.jpg
    
        3
  •  10
  •   Community Mohan Dere    9 年前

    因为这就是大括号展开的作用。从 man bash ,在标题下 Brace expansion 以下内容:

    要展开的支撑模式 AN的形式 可选序言,后跟…逗号分隔的一系列 串。。。后面是可选的 附言。前导码有前缀 到包含在 大括号,然后将PostScript附加到每个结果 字符串,从左向右展开 例如,a d、c、b e展开为 __ade ace abe_

    因此,在您的示例中,“d”是序言,“.jpg\n”是后记。

    所以,在大括号展开之后,您只剩下:

    echo -e Da.jpg\n Db.jpg\n Dc.jpg\n

    和海吉尔一样 points out 然后,shell将其拆分为三个令牌,并将它们传递给echo;echo将输出每个由空格分隔的令牌。要获得您想要的输出,您需要使用这里的许多建议之一,不要在令牌之间重新插入不需要的空间。

    这样做的时间更长,而且可能不是最整洁的方式,但下面给出了您需要的输出:

    for file in "D"{a,b,c}".jpg"
    do
      echo ${file}
    done
    
        4
  •  4
  •   Greg Hewgill    16 年前

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

        5
  •  2
  •   alvherre    16 年前

    您可以通过使用xargs将第一个回声所吐出的参数分隔成一行来获得所需的效果:

    $ echo "D"{a,b,c}".jpg" | xargs -n1 echo
    Da.jpg
    Db.jpg
    Dc.jpg
    
        6
  •  2
  •   Dennis Williamson    16 年前

    您可以通过预先设置一个空值来获得更一致的外观:

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

    现在他们都有了额外的空间。此外,使用 -n 消除了末尾多余的换行符。此外,可以在支架展开中使用范围。

        7
  •  0
  •   daneel    7 年前

    下面是一个使用 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