У меня есть файл с именем, /tmp/urlFile
где каждая строка представляет URL-адрес. Я пытаюсь прочитать из файла следующее:
cat "/tmp/urlFile" | while read url
do
echo $url
done
Если последняя строка не заканчивается символом новой строки, эта строка не будет прочитана. Мне было интересно, почему?
Можно ли прочитать все строки, независимо от того, заканчиваются ли они новой строкой или нет?
awk 1 /tmp/urlFile
.. такawk 1 /tmp/urlFile | while ...
Ответы:
Вы бы сделали:
(по сути, этот цикл добавляет недостающий символ новой строки в последней (не) строке).
Смотрите также:
источник
printf
вызовы здесь имеют\n
.Это, кажется, решается частично с помощью
readarray -t
:Однако обратите внимание, что, хотя это работает для файлов разумного размера, это решение представляет потенциальную новую проблему с очень большими файлами - сначала оно считывает файл в массив, который затем должен быть повторен. Для очень больших файлов это может занимать много времени и памяти, что может привести к сбою.
источник
По определению текстовый файл состоит из последовательности строк. Строка заканчивается символом новой строки. Таким образом, текстовый файл заканчивается символом новой строки, если он не пустой.
read
Встроенный предназначено только для чтения текстовых файлов. Вы не передаете текстовый файл, поэтому вы не можете надеяться, что он будет работать без проблем. Оболочка читает все строки - пропускаются лишние символы после последней строки.Если у вас есть потенциально искаженный входной файл, в котором может отсутствовать последняя строка, вы можете добавить в него новую строку, просто чтобы быть уверенным.
Файлы, которые должны быть текстовыми файлами, но без последней строки, часто создаются редакторами Windows. Это обычно происходит в сочетании с окончаниями строк Windows, которые являются CR LF, в отличие от Unix LF. Символы CR редко бывают полезными в любом месте и ни в коем случае не могут появляться в URL, поэтому их следует удалить.
В случае, если входной файл правильно сформирован и заканчивается новой
echo
строкой , добавляется дополнительная пустая строка. Поскольку URL не могут быть пустыми, просто игнорируйте пустые строки.Обратите внимание, что
read
строки не читаются простым способом. Он игнорирует начальные и конечные пробелы, что для URL, вероятно, желательно. Он обрабатывает обратную косую черту в конце строки как escape-символ, в результате чего следующая строка соединяется с первой минус последовательность backslash-newline, что определенно нежелательно. Таким образом, вы должны передать-r
опциюread
. Это очень, очень редко,read
чтобы быть правильным, а неread -r
.источник
Ну,
read
возвращает ложное значение, если оно встречает конец файла перед новой строкой, но даже если это так, оно все равно присваивает прочитанное значение. Итак, мы можем проверить,read
возвращает ли последний вызов что-то еще, кроме пустой строки, и обработать это как обычно. Таким образом, выход из цикла возможен только послеread
возврата false и пустой строки:источник
Другой способ будет выглядеть так:
Ссылается отсюда .
источник
Это бесполезное использование
cat
.По иронии судьбы вы можете заменить этот
cat
процесс на что-то действительно полезное: инструмент, который есть в системах POSIX для добавления отсутствующего перевода строки и преобразования файла в правильный текстовый файл POSIX.дальнейшее чтение
источник
read
указано в этих случаях.