2010-01-05 9 views
8

ottengo:Bash: Perché echo aggiunge spazio extra?

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

Nota: Gli spazi aggiuntivi prima di Db e Dc sulla linea 2 ° e 3 ° dell'uscita.

Perché ci sono questi?

Grazie, Dan

Edit: Dal momento che il mio obiettivo reale era spazi in esso (che avrei scritto in origine):

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

La maggior parte delle soluzioni qui non ha funzionato per me (per loop, xarg, tr). Printf non ha funzionato a causa di più espansioni di parentesi che voglio prodotto cantesiano.

ho combinato 3 soluzioni (\ b di mletterle, spazio in più di Dennis Williamson, e Jim Dennis sta usando molto meno le virgolette) per ottenere:

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

Grazie a tutti che ha risposto! Ho imparato molto dalle tue risposte!

Dan

+2

'echo' non può fare altro qui, sta ottenendo gli spazi da' bash'. –

+1

Per aggirare il problema utilizzare: echo -e D {a, b, c} .jpg \\ n | tr -d "" (traduci l'utilità con l'opzione -d --- delete). (A proposito: non hai bisogno di tutte quelle citazioni, solo un extra \ è sufficiente). –

risposta

0

la soluzione più semplice e più pulito è quello di aggiungere un backspace alla parte anteriore di ogni riga:

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

Questo produce l'uscita desiderata.

+0

non sulla mia macchina dado ubuntu - questo dà 'Db.jpg' per la seconda riga, che è corretta, ma' a. jpg' per la prima riga, che non lo è, d'altra parte, funziona sul mio mac che esegue Leopard. –

+0

Questo è strano .. funziona sulla mia macchina karmico di ubuntu karmic ... strano. – mletterle

+0

Immagino che alcuni bug siano stati corretti tra Dapper e Koala :) –

4

echo aggiunge sempre gli spazi tra gli argomenti. Prova il tuo comando senza \n e confronta i risultati.

+3

Non è "echo" che aggiunge gli spazi. Prova solo "D" {a, b, c} ". Jpg" 'alla riga di comando - otterrai' bash: Da.jpg: comando non trovato'. È l'espansione della coppia che aggiunge gli spazi. –

+1

L'espansione del controvento separa gli argomenti con spazi bianchi; echo aggiunge uno spazio tra gli argomenti. Prova 'echo foo [spazio] [spazio] [spazio] [spazio] [spazio] [spazio] [spazio] bar' con un sacco di spazi tra gli argomenti. –

+0

... corretto, ma irrilevante. ma il problema qui è che l'espansione di parentesi graffe sta aggiungendo un singolo spazio che Dan non vuole. 'echo' non sta aggiungendo o sottraendo nulla. –

9

Perché questo è l'espansione del rinforzo. Da man bash, intitolato Brace expansion: brace

Patterns essere espansa prendere la forma di un preambolo opzionale , seguita da una serie di ... separati da virgole stringhe ... seguita eventualmente da un PostScript. Il preambolo è prefissato a ogni stringa contenuta nei parentesi, e il postscript viene quindi aggiunto ad ogni stringa risultante, espandendo da sinistra a destra Ad esempio, un {d, c, b} e si espande in 'ade ace Abe '

Quindi nel vostro esempio, "D" è il preambolo e ".jpg \ n" è il poscritto.

Così, dopo il verificarsi di espansione delle parentesi graffe, si è lasciato con:

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

Come Hewgill points out, la shell poi si divide questo in tre gettoni e li passa a risuonare; che emette ciascun token separato da uno spazio. Per ottenere l'output desiderato, è necessario utilizzare uno dei molti suggerimenti qui che non reinseriscono lo spazio indesiderato tra i token.

E 'più a lungo e, probabilmente, non è il modo più grazioso per fare questo, ma la seguente fornisce l'output che stai dopo:

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

Grazie per la grande esplosione! – Dan

2

è possibile ottenere l'effetto desiderato utilizzando xargs per separare gli argomenti sputo dal primo eco in una linea di ciascuna:

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

Oooh, gustoso, mi piace molto meglio del mio ciclo for –

9

utilizzare il più portabile printf

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

+1 per suggerire il modo POSIXy ed evitare l'eco con tutte le sue insidie. – Jens

1

È possibile ottenere un aspetto più coerente anteponendo un null:

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

Ora tutti hanno uno spazio aggiuntivo. Inoltre, l'utilizzo di -n elimina la nuova riga aggiuntiva alla fine. Inoltre, puoi usare un intervallo nella tua espansione di parentesi graffe.

Problemi correlati