Eu tenho um arquivo chamado /tmp/urlFile
onde cada linha representa um URL. Estou tentando ler o arquivo da seguinte maneira:
cat "/tmp/urlFile" | while read url
do
echo $url
done
Se a última linha não terminar com um caractere de nova linha, essa linha não será lida. Eu queria saber por que?
É possível ler todas as linhas, independentemente de terem terminado com uma nova linha ou não?
awk 1 /tmp/urlFile
.. entãoawk 1 /tmp/urlFile | while ...
Respostas:
Você faria:
(efetivamente, esse loop adiciona de volta a nova linha ausente na última linha (não)).
Veja também:
fonte
printf
chamadas aqui têm\n
.Isso parece ser resolvido em parte com
readarray -t
:Observe, no entanto, que, embora isso funcione para arquivos de tamanho razoável, esta solução apresenta um novo problema em potencial com arquivos muito grandes - ele primeiro lê o arquivo em uma matriz que deve ser iterada. Para arquivos muito grandes, isso pode consumir tempo e memória, potencialmente ao ponto de falha.
fonte
Por definição , um arquivo de texto consiste em uma sequência de linhas. Uma linha termina com um caractere de nova linha. Assim, um arquivo de texto termina com um caractere de nova linha, a menos que esteja vazio.
O
read
built-in destina-se apenas a ler arquivos de texto. Você não está passando um arquivo de texto, portanto, não pode esperar que ele funcione perfeitamente. O shell lê todas as linhas - o que está pulando são os caracteres extras após a última linha.Se você tiver um arquivo de entrada potencialmente malformado que pode estar faltando sua última linha, poderá adicionar uma nova linha a ele, apenas para ter certeza.
Os arquivos que devem ser arquivos de texto, mas que não possuem a nova linha final, geralmente são produzidos pelos editores do Windows. Isso geralmente ocorre em combinação com as terminações de linha do Windows, que são CR LF, em oposição ao LF do Unix. Os caracteres CR raramente são úteis em qualquer lugar e, em qualquer caso, não podem aparecer nos URLs; portanto, você deve removê-los.
Caso o arquivo de entrada seja bem formado e termine com uma nova linha, isso
echo
adiciona uma linha em branco extra. Como os URLs não podem estar vazios, apenas ignore as linhas em branco.Observe também que
read
não lê linhas de maneira direta. Ele ignora os espaços em branco à esquerda e à direita, o que para um URL é provavelmente desejável. Ele trata a barra invertida no final de uma linha como um caractere de escape, fazendo com que a próxima linha seja unida à primeira menos a sequência barra invertida-nova linha, o que definitivamente não é desejável. Então você deve passar a-r
opção pararead
. É muito, muito raroread
ser a coisa certa e nãoread -r
.fonte
Bem,
read
retorna um valor falso se encontrar o final do arquivo antes de uma nova linha, mas, mesmo que isso aconteça, ele ainda atribui o valor lido. Portanto, podemos verificar se a chamada finalread
retorna algo diferente de uma linha vazia e processá-la normalmente. Portanto, apenas saia do loop apósread
retornar false e a linha estar vazia:fonte
Outra maneira seria assim:
Referido a partir daqui .
fonte
Este é um uso inútil de
cat
.Ironicamente, você pode substituir o
cat
processo aqui por algo realmente útil: uma ferramenta que os sistemas POSIX possuem para adicionar a nova linha ausente e transformar o arquivo em um arquivo de texto POSIX adequado.Leitura adicional
fonte
read
for especificado nesses casos.