Domanda

Ottengo:

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

Nota:Gli spazi extra prima di Db e Dc sulla 2a e 3a riga dell'output.

Perché sono lì?

Grazie, Dan

Modificare:Poiché il mio obiettivo reale conteneva degli spazi (che avrei dovuto scrivere originariamente):

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

La maggior parte delle soluzioni qui non ha funzionato per me (for loop, xarg, tr).Printf non ha funzionato a causa delle espansioni multiple delle parentesi graffe che voglio produrre come prodotto cantesiano.

Ho combinato 3 soluzioni (mletterle \b, spazio extra di Dennis Williamson e Jim Dennis utilizzando molte meno virgolette) per ottenere:

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

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

Dan

È stato utile?

Soluzione

La soluzione più semplice e pulita è aggiungere un backspace all'inizio di ogni riga:

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

Questo produce l'output desiderato.

Altri suggerimenti

utilizzare il printf più portatile

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

Perché questo è ciò che fa l'espansione del tutore.Da man bash, sotto la voce Brace expansion:

I modelli da espandere si estendono assumono la forma di un preambolo opzionale, seguito da ...una serie di stringhe separate da virgola ...seguito da un postscription opzionale.Il preambolo viene prefisso su ciascuna stringa contenuta all'interno delle parentesi

Quindi nel tuo esempio, "D" è il preambolo e ".jpg " è il postscript.

Quindi, dopo che si è verificata l'espansione del rinforzo, ti rimane:

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

Come Hewgill sottolinea, la shell quindi lo divide in tre token e li passa a echo;che restituisce ciascun token separato da uno spazio.Per ottenere l'output desiderato, è necessario utilizzare uno dei tanti suggerimenti qui che non reinseriscano lo spazio indesiderato tra i token.

È più lungo e probabilmente non è il modo più accurato per farlo, ma quanto segue fornisce l'output che stai cercando:

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

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

Puoi ottenere l'effetto desiderato usando xargs per separare gli argomenti sputati dal primo echo in una riga ciascuno:

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

Puoi ottenere un aspetto più coerente anteponendo un null:

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

Ora hanno tutti uno spazio in più.Inoltre, utilizzando -n elimina il ritorno a capo extra alla fine.Inoltre, puoi utilizzare un intervallo nell'espansione del tutore.

Ecco una soluzione utilizzando sed (che si basa su https://stackoverflow.com/a/2003856/8180143):

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

Questa soluzione ha il vantaggio di lavorare con input dotati di spazi, ad es.

$ echo -en "" "D "{a..c}".jpg\n" | sed 's/ //'
D a.jpg
D b.jpg
D c.jpg
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top