Saya memiliki file dengan nama /tmp/urlFile
tempat setiap baris mewakili url. Saya mencoba membaca dari file sebagai berikut:
cat "/tmp/urlFile" | while read url
do
echo $url
done
Jika baris terakhir tidak berakhir dengan karakter baris baru, baris itu tidak akan dibaca. Saya bertanya-tanya mengapa?
Apakah mungkin untuk membaca semua baris, terlepas dari apakah itu diakhiri dengan baris baru atau tidak?
awk 1 /tmp/urlFile
.. soawk 1 /tmp/urlFile | while ...
Jawaban:
Anda akan melakukannya:
(secara efektif, loop itu menambahkan kembali baris baru yang hilang pada baris terakhir (non-)).
Lihat juga:
sumber
printf
panggilan di sini\n
.Ini tampaknya diselesaikan sebagian dengan
readarray -t
:Namun perlu dicatat bahwa sementara ini bekerja untuk file berukuran cukup, solusi ini memperkenalkan potensi masalah baru dengan file yang sangat besar - pertama kali membaca file ke dalam array yang kemudian harus diulangi. Untuk file yang sangat besar ini bisa memakan waktu dan memori, berpotensi sampai pada titik kegagalan.
sumber
Menurut definisi , file teks terdiri dari urutan garis. Sebuah garis diakhiri dengan karakter baris baru. Dengan demikian file teks berakhir dengan karakter baris baru, kecuali jika kosong.
The
read
builtin hanya dimaksudkan untuk membaca file teks. Anda tidak melewatkan file teks, jadi Anda tidak bisa berharap itu berfungsi dengan mulus. Shell membaca semua baris - apa yang dilompati adalah karakter tambahan setelah baris terakhir.Jika Anda memiliki file input yang berpotensi cacat yang mungkin hilang pada baris terakhir, Anda dapat menambahkan baris baru untuknya, hanya untuk memastikan.
File yang seharusnya berupa file teks tetapi tidak ada baris terakhir akhir sering diproduksi oleh editor Windows. Ini biasanya berjalan dalam kombinasi dengan ujung garis Windows, yang CR LF, yang bertentangan dengan LF Unix. Karakter CR jarang berguna di mana saja, dan tidak dapat muncul dalam URL dalam hal apa pun, jadi Anda harus menghapusnya.
Jika file input terbentuk dengan baik dan diakhiri dengan baris baru, baris
echo
tambahan kosong ditambahkan. Karena URL tidak boleh kosong, abaikan saja baris kosong.Perhatikan juga bahwa
read
tidak membaca garis secara langsung. Itu mengabaikan spasi putih terkemuka, dan yang untuk URL mungkin diinginkan. Ini memperlakukan backslash pada akhir baris sebagai karakter pelarian, menyebabkan baris berikutnya bergabung dengan yang pertama minus urutan backslash-newline, yang jelas tidak diinginkan. Jadi, Anda harus meneruskan-r
opsi keread
. Sangat, sangat jarang untukread
menjadi hal yang benar daripadaread -r
.sumber
Nah,
read
mengembalikan nilai palsu jika memenuhi akhir file sebelum baris baru, tetapi bahkan jika itu, nilai itu masih menetapkan nilai yang dibacanya. Jadi, kita dapat memeriksa apakah panggilan akhirread
mengembalikan sesuatu selain dari baris kosong, dan memprosesnya seperti biasa. Jadi, hanya keluar dari loop setelahread
mengembalikan false dan baris kosong:sumber
Cara lain akan seperti ini:
Dirujuk dari sini .
sumber
Ini adalah Penggunaan yang Tidak Berguna dari
cat
.Ironisnya, Anda dapat mengganti
cat
proses di sini dengan sesuatu yang benar-benar berguna: alat yang sistem POSIX miliki untuk menambahkan baris baru yang hilang, dan menjadikan file tersebut menjadi file teks POSIX yang tepat.Bacaan lebih lanjut
sumber
read
ditentukan dalam kasus tersebut.