Bash: ¿Por qué ECHO agrega espacio adicional?
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
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