Pregunta

Yo obtengo:

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

Nota: Los espacios adicionales antes de DB y DC en la segunda y tercera línea de la salida.

¿Por qué están allí?

Gracias Dan

Editar: Dado que mi objetivo real tenía espacios (que debería haber escrito originalmente):

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

La mayoría de las soluciones aquí no funcionaron para mí (para Loop, Xarg, TR). Printf no funcionó debido a múltiples expansiones de aparatos ortopédicos que quiero hacer un producto Cantesian.

Combiné 3 soluciones (Mletterle's B, el espacio adicional de Dennis Williamson y el uso de Jim Dennis usando muchas menos citas) para obtener:

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

¡Gracias a todos los que respondieron! ¡Aprendí mucho de tus respuestas!

Dan

¿Fue útil?

Solución

La solución más fácil y limpia es agregar un espacio de retroceso al frente de cada línea:

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

Esto produce la salida deseada.

Otros consejos

Use el impreso más portátil

$ printf "D%s.jpg\n" {a,b,c}
Da.jpg
Db.jpg
Dc.jpg

Porque eso es lo que hace la expansión de Brace. De man bash, bajo el encabezado Brace expansion:

Los patrones que se expanden, tome la forma de un preámbulo opcional, seguido de ... una serie de cadenas separadas por comas ... seguido de una posdata opcional. El preámbulo está prefijado a cada cadena contenida dentro de los aparatos ortopédicos, y el PostScript se agrega a cada cadena resultante, expandiendo de izquierda a derecha, por ejemplo, a {d, c, b} e se expande en 'ade Ace abe'

Entonces, en su ejemplo, "D" es el preámbulo y ".jpg n" es el PostScript.

Entonces, después de que ocurre la expansión de la abrazadera, te queda:

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

Como hewgill Señala, el caparazón luego divide esto en tres tokens y los pasa al eco; que genera cada token separado por un espacio. Para obtener la salida que desea, debe usar una de las muchas sugerencias aquí que no vuelven a insertar el espacio no deseado entre las fichas.

Es más largo y probablemente no es la forma más buena de hacer esto, pero lo siguiente da la salida que busca:

for file in "D"{a,b,c}".jpg"
do
  echo ${file}
done

echo Siempre agrega espacios entre argumentos. Prueba tu comando sin \n y comparar los resultados.

Puede obtener el efecto deseado utilizando XARGS para separar los argumentos que se escupe por el primer eco en una línea cada uno:

$ echo "D"{a,b,c}".jpg" | xargs -n1 echo
Da.jpg
Db.jpg
Dc.jpg

You can get a more consistent look by prepending a null:

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

Now they all have an extra space. Also, using -n eliminates the extra newline at the end. Also, you can use a range in your brace expansion.

Here is a solution using sed (that builds upon https://stackoverflow.com/a/2003856/8180143):

$ echo -en "" "D"{a..c}".jpg\n" | sed 's/ //'
Da.jpg
Db.jpg
Dc.jpg

This solution has the advantage of working with inputs having spaces, e.g.,

$ echo -en "" "D "{a..c}".jpg\n" | sed 's/ //'
D a.jpg
D b.jpg
D c.jpg
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top