me gustaría
$ echo a{b,c,d}
para generar una lista separada por comas como
ab,ac,ad
en lugar de la salida habitual
ab ac ad
¿Cuál es la forma más fácil de hacer eso en la línea de comando?
Suponiendo que los elementos no contienen espacios, puede traducir espacios a comas:
echo a{b,c,d} | tr ' ' ,
que produce:
ab,ac,ad
También puede usar rangos con caracteres:
echo a{b..d} | tr ' ' ,
Esto es especialmente útil si desea un rango mayor.
Parece que bash no usa $ IFS para unir las palabras generadas. Otra técnica sería almacenar las palabras generadas en una matriz y luego $ IFS estará en juego:
Voy a usar un subshell para no alterar el IFS de este shell: elija uno de
( words=( a{b,c,d} ); IFS=,; echo "${words[*]}" )
( set -- a{b,c,d}; IFS=,; echo "$*" )
Eso emite la cadena separada por comas a stdout. Si quieres capturarlo:
joined=$( set -- a{b,c,d}; IFS=,; echo "$*" )
Estoy seguro de que hay muchas maneras de lograr esto. Aquí hay un método:
fuente
Expanda los elementos como mostró y luego repítelos, agregando la coma a todos menos a la primera iteración:
Resultado:
Ver sustitución de parámetros bash .
fuente
Aquí hay una solución solo para bash.
La parte anterior al punto y coma se asigna
ab ac ad
a la variableIN
y la segunda parte utiliza la búsqueda y reemplazo para cambiar todos los espacios a comas. El//
significa que todos los partidos, no sólo el primero.Hágalo todo en un subshell (los paréntesis adjuntos) para no contaminar su espacio de nombres.
fuente
Vale la pena señalar que en muchos contextos, una coma final es aceptable en dicha lista. SI una coma final es aceptable, la forma más fácil de manejar la sustitución es
printf
:(¿Dónde
some-command
está un comando que se ejecuta en una lista separada por comas y no le importa una coma final?)En realidad, incluso si no debe tener una coma final, puede usarla
printf
; solo necesita especificar el número de argumentos que espera, lo que lo hace más torpe para listas muy largas:fuente