
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 sed
e 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 $i
nos 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.