Anexar string à variável com delimitador

Anexar string à variável com delimitador

Preciso de ajuda para resolver esse problema, tenho um arquivo que contém uma lista de nomes:

nomes.txt

roger
peter
henry

Eu gostaria de concatenar :depois de cada nome

for i in $(cat names.txt); do
   $i+=$i":"
done 

A saída que eu quero é estaroger:peter:henry

mas estou recebendo esta saídaroger:peter:henry:

Responder1

Existe uma ferramenta que pode fazer isso por você:paste

$ paste -sd: names.txt
roger:peter:henry

Responder2

Uma solução alternativa com sede tr:

sed '$!s/$/:/' names.txt | tr -d '\n'

Saídas:

roger:peter:henry

Responder3

pasteé a ferramenta certa para o trabalho. Mas apenas para completar, veja como fazer o que você estava tentando:

k="$(head -n1 names.txt)";
for i in $(tail -n+2 names.txt); do 
    k="$k:$i"; 
done

Isso produz:

$ echo "$k"
roger:peter:henry

Responder4

$i+=$i":"

Isso não faz o que você deseja. Em vez disso, ele se expande $inos locais marcados e tenta executar o resultado como um comando. Uma atribuição de shell não usa o cifrão no lado esquerdo (pense nisso como pegar o valor da variável, aqui não queremos isso, mas o local para armazenar). Em vez disso , deveria ser i+=$i":". Ou, de preferência, i+="$i:"apenas para adquirir o hábito de citar expansões de variáveis ​​de shell.

Além disso, você está tentando anexar à variável usada como variável de loop. Isso não é muito útil, pois é substituído na próxima rodada do loop. Além disso, você está adicionando dois pontos após cada item, incluindo o último, para ter um no final. Mas podemos removê-lo posteriormente com a ${var%suffix}expansão.

Então:

s=
for i in $(cat names.txt); do
   s+="$i:"
done 
s=${s%:}

Embora esteja ciente de que a expansão sem aspas de $(cat)processará quaisquer padrões curinga de nome de arquivo (globs), portanto, uma linha *no arquivo será expandida para todos os arquivos no diretório atual, etc.

informação relacionada