Alguns caracteres desaparecem após o processamento de um arquivo de texto

1

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

    
por nicolasfo 13.03.2015 / 11:03

2 respostas

0

Recomenda-se que eu experimente dos2unix addresses.txt , e posso dizer que isso resolveu o problema. Muito obrigado !!

    
por 13.03.2015 / 11:31
0

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') .

    
por 13.03.2015 / 23:14