J'aimerais
$ echo a{b,c,d}
pour afficher une liste séparée par des virgules comme
ab,ac,ad
au lieu de la sortie habituelle
ab ac ad
Quelle est la façon la plus simple de le faire sur la ligne de commande?
En supposant que les éléments ne contiennent pas d'espaces, vous pouvez traduire les espaces en virgules:
echo a{b,c,d} | tr ' ' ,
qui produit:
ab,ac,ad
Vous pouvez également utiliser des plages de caractères:
echo a{b..d} | tr ' ' ,
Ceci est particulièrement utile si vous souhaitez une gamme plus large.
Il semble que bash n'utilise pas $ IFS pour joindre les mots générés. Une autre technique serait de stocker les mots générés dans un tableau puis $ IFS sera en jeu:
Je vais utiliser un sous-shell donc je ne modifie pas l'IFS de ce shell: choisissez l'un des
( words=( a{b,c,d} ); IFS=,; echo "${words[*]}" )
( set -- a{b,c,d}; IFS=,; echo "$*" )
Cela émet la chaîne séparée par des virgules vers stdout. Si vous voulez le capturer:
joined=$( set -- a{b,c,d}; IFS=,; echo "$*" )
Je suis sûr qu'il existe de nombreuses façons d'y parvenir. Voici une méthode:
la source
Développez les éléments comme vous l'avez montré, puis bouclez-les, en ajoutant la virgule à tous sauf la première itération:
Résultat:
Voir substitution de paramètres bash .
la source
Voici une solution bash uniquement.
La partie avant le point-virgule assigne
ab ac ad
à la variableIN
et la deuxième partie utilise la recherche et le remplacement pour remplacer tous les espaces par des virgules. Cela//
signifie tous les matchs, pas seulement le premier.Faites tout cela dans un sous-shell (les parenthèses englobantes) pour ne pas polluer votre espace de noms.
la source
Il convient de noter que dans de nombreux contextes, une virgule de fin est acceptable dans une telle liste. SI une virgule de fin est acceptable, la façon la plus simple de gérer la substitution est
printf
:(Où
some-command
est une commande qui s'exécute sur une liste séparée par des virgules et ne se soucie pas d'une virgule de fin.)En fait, même si vous ne devez pas avoir de virgule de fin, vous pouvez utiliser
printf
; il vous suffit de spécifier le nombre d'arguments que vous attendez, ce qui le rend plus maladroit pour les très longues listes:la source