Recomenda-se que eu experimente dos2unix addresses.txt
, e posso dizer que isso resolveu o problema. Muito obrigado !!
Eu tenho um arquivo chamado addresses.txt:
[email protected]
[email protected]
[email protected]
Gostaria de fazer eco de "[email protected]" usando o loop. Aqui está o que eu fiz:
cat addresses.txt | while read address
do
echo "${address}.html"
done
Aqui está o resultado:
[email protected]
[email protected]
[email protected]
O mesmo resultado se eu adicionar um espaço entre a variável e ".html"
O que eu sinto falta?
Obrigado
Recomenda-se que eu experimente dos2unix addresses.txt
, e posso dizer que isso resolveu o problema. Muito obrigado !!
O que está acontecendo é que o arquivo está no formato do Windows, onde as novas linhas são representadas pela combinação de dois caracteres CR, LF. Você está usando ferramentas Unix que esperam que as linhas novas sejam representadas da maneira Unix, apenas com o caractere LF. O shell trata o CR (retorno de carro) como um caractere comum, portanto, ele se torna parte do valor da variável address
. Quando você imprime o resultado em um terminal, o terminal interpreta o caractere CR como "voltar para o início da linha atual", e é por isso que o .html
bit que vem após o CR substitui o início da linha. / p>
Você pode converter o arquivo para usar novas linhas do Unix .
Se você quiser que seu código seja robusto para inserir arquivos com codificação de nova linha do Windows, você pode dizer ao shell para tratar CR como um caractere de espaço em branco adicionando-o ao IFS
variable .
while IFS="$IFS$(printf '\r')" read address; do
echo "${address}.html"
done <addresses.txt
Outra solução seria retirar o caractere CR do final do valor, caso ele esteja lá, usando um expansão de parâmetro construção de manipulação de cadeia. Note que a linha invertida-nova linha para continuação de linha não funcionará se o arquivo realmente contiver barra invertida-CR-nova linha, então você deve desligar isso para evitar confusão.
CR=$(printf '\r')
while read -r address; do
address=${address%$CR}
echo "${address}.html"
done <addresses.txt
No ksh93, bash e zsh, você pode usar $'\r'
em vez de $(printf '\r')
.