Pergunta

Eu recebo:

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

Nota: Os espaços extras antes de DB e DC na 2ª e 3ª linha da saída.

Por que eles estão lá?

Obrigado, Dan

Editar: Como meu objetivo real tinha espaços (que eu deveria ter escrito originalmente):

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

A maioria das soluções aqui não funcionou para mim (para Loop, Xarg, Tr). O PrintF não funcionou por causa de várias expansões do aparelho que eu quero para o produto canteres.

Combinei 3 soluções ( B de Mletterle, o espaço extra de Dennis Williamson e Jim Dennis usando muito menos citações) para obter:

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

Obrigado a todos que responderam! Eu aprendi muito com suas respostas!

Dan

Foi útil?

Solução

A solução mais fácil e limpa é adicionar um backspace à frente de cada linha:

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

Isso produz a saída desejada.

Outras dicas

Use a impressão mais portátil

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

Porque é isso que a expansão do BRACE faz. A partir de man bash, sob o título Brace expansion:

Os padrões a serem ampliados assumem a forma de um preâmbulo opcional, seguido de ... uma série de strings separados por vírgula ... seguida por um PostScript opcional. O preâmbulo é prefixado para cada string contida dentro dos aparelhos, e o PostScript é então anexado a cada string resultante, expandindo a esquerda para a direita, por exemplo, a {d, c, b} e se expande para 'Ade Ace Abe'

Portanto, no seu exemplo, "D" é o preâmbulo e ".jpg n" é o PostScript.

Então, após a expansão da cinta, você fica com:

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

Como Hewgill aponta, a concha então divide isso em três fichas e os passa para ecoar; que produz cada token separado por um espaço. Para obter a saída que você deseja, você precisa usar uma das muitas sugestões aqui que não se inseriu novamente no espaço indesejado entre os tokens.

É mais longo e provavelmente não é a maneira mais interessante de fazer isso, mas o seguinte fornece a saída que você procura:

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

echo Sempre adiciona espaços entre argumentos. Experimente o seu comando sem \n e compare os resultados.

Você pode obter o efeito desejado usando XARGs para separar os argumentos cuspir pelo primeiro eco em uma linha cada:

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

Você pode ter uma aparência mais consistente, precendendo um nulo:

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

Agora todos eles têm um espaço extra. Além disso, usando -n elimina a nova linha extra no final. Além disso, você pode usar um intervalo em sua expansão de cinta.

Aqui está uma solução usando sed (que se baseia em https://stackoverflow.com/a/2003856/8180143):

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

Esta solução tem a vantagem de trabalhar com insumos com espaços, por exemplo,

$ echo -en "" "D "{a..c}".jpg\n" | sed 's/ //'
D a.jpg
D b.jpg
D c.jpg
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top