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

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top