Bash: Pourquoi ajouter un espace supplémentaire d'écho?
Question
Je reçois:
$ echo -e "D"{a,b,c}".jpg\n"
Da.jpg
Db.jpg
Dc.jpg
Note:. Les espaces supplémentaires avant Db et Dc sur la 2ème et 3ème ligne de la sortie
Pourquoi ces là?
Merci, Dan
Modifier : Étant donné que mon objectif réel avait des espaces dans ce (que j'aurais écrit à l'origine):
echo -e "Name"{,.}" "{-,}"extra"{,so}" 5v5 "{one,two,No\ four}{,!,\!\!}"\n"
La plupart des solutions ici ne fonctionnent pas pour moi (pour la boucle, xarg, tr). Printf ne fonctionnait pas à cause de multiples accolades extensions que je veux cantesian produit.
I combiné 3 solutions (\ mletterle de la b, l'espace supplémentaire de Dennis Williamson, et Jim à l'aide de Dennis beaucoup moins citations) pour obtenir:
echo -e "" \\bName{,.}\ {-,}extra{,so}\ 5v5\ {one,two,No\ four}{,\!,\!\!}\\n
Merci à tous qui ont répondu! J'ai appris beaucoup de vos réponses!
Dan
La solution
Le plus simple et plus propre solution est d'ajouter un backspace à l'avant de chaque ligne:
echo -e -n "\bD"{a,b,c}".jpg\n"
Ceci produit le résultat souhaité.
Autres conseils
utiliser plus printf portable
$ printf "D%s.jpg\n" {a,b,c}
Da.jpg
Db.jpg
Dc.jpg
Parce que ce que fait le développement des accolades. De man bash
, sous la rubrique Brace expansion
:
Les motifs qui seront élargi prendre la sous forme d'une préambule facultatif, suivi d'une série de ... séparées par des virgules cordes ... suivi d'une option postscript. Le préambule est préfixé à chaque chaîne contenue dans la Appareil dentaire, et le post-scriptum est ensuite ajouté à chaque résultant chaîne, Expanding gauche à droite Par exemple, un {d, c, b} e étend ses activités « As ade abe »
Dans votre exemple, "D" est le préambule et ".jpg \ n" est la postface.
Ainsi, après le développement des accolades se produit, vous vous retrouvez avec:
echo -e Da.jpg\n Db.jpg\n Dc.jpg\n
souligne , la coquille divise alors cela en trois jetons et les transmet à l'écho; qui délivre en sortie chaque jeton séparés par un espace. Pour obtenir la sortie que vous voulez, vous devez utiliser l'une des nombreuses suggestions ici qui ne sont pas réinsérés l'espace non désiré entre des jetons.
Il est plus long et sans doute pas la plus élégante façon de faire, mais ce qui suit donne la sortie que vous êtes après:
for file in "D"{a,b,c}".jpg"
do
echo ${file}
done
echo
ajoute toujours des espaces entre les arguments. Tentez votre commande sans \n
et comparer les résultats.
Vous pouvez obtenir l'effet désiré en utilisant xargs pour séparer les arguments crachent par le premier écho en ligne chaque:
$ echo "D"{a,b,c}".jpg" | xargs -n1 echo
Da.jpg
Db.jpg
Dc.jpg
Vous pouvez obtenir un look plus cohérente préfixant nulle:
$ echo -en "" "D"{a..c}".jpg\n"
Da.jpg
Db.jpg
Dc.jpg
Maintenant, ils ont tous un espace supplémentaire. , En utilisant -n
élimine également la nouvelle ligne supplémentaire à la fin. , Vous pouvez également utiliser une plage dans l'expansion de votre accolade.
Voici une solution en utilisant sed
(qui prend appui sur https://stackoverflow.com/a/2003856/8180143 ):
$ echo -en "" "D"{a..c}".jpg\n" | sed 's/ //'
Da.jpg
Db.jpg
Dc.jpg
Cette solution présente l'avantage de travailler avec des entrées ayant des espaces, par ex.,
$ echo -en "" "D "{a..c}".jpg\n" | sed 's/ //'
D a.jpg
D b.jpg
D c.jpg