Misalkan Anda memiliki file ini:
$ cat /tmp/test.txt
Line 1
Line 2 has leading space
Line 3 followed by blank line
Line 5 (follows a blank line) and has trailing space
Line 6 has no ending CR
Ada empat elemen yang akan mengubah arti dari output file yang dibaca oleh banyak solusi Bash:
- Baris kosong 4;
- Ruang depan atau belakang pada dua garis;
- Mempertahankan makna garis individual (yaitu, setiap baris adalah catatan);
- Jalur 6 tidak diakhiri dengan CR.
Jika Anda ingin file teks baris demi baris termasuk baris kosong dan mengakhiri baris tanpa CR, Anda harus menggunakan loop sementara dan Anda harus memiliki tes alternatif untuk baris terakhir.
Berikut adalah metode yang dapat mengubah file (dibandingkan dengan apa yang cat
kembali):
1) Kehilangan baris terakhir dan spasi terdepan dan tertinggal:
$ while read -r p; do printf "%s\n" "'$p'"; done </tmp/test.txt
'Line 1'
'Line 2 has leading space'
'Line 3 followed by blank line'
''
'Line 5 (follows a blank line) and has trailing space'
(Jika Anda melakukannya while IFS= read -r p; do printf "%s\n" "'$p'"; done </tmp/test.txt
, Anda mempertahankan spasi di depan dan di belakang tetapi masih kehilangan baris terakhir jika tidak diakhiri dengan CR)
2) Menggunakan proses substitusi dengan cat
akan membaca seluruh file dalam satu tegukan dan kehilangan arti dari setiap baris:
$ for p in "$(cat /tmp/test.txt)"; do printf "%s\n" "'$p'"; done
'Line 1
Line 2 has leading space
Line 3 followed by blank line
Line 5 (follows a blank line) and has trailing space
Line 6 has no ending CR'
(Jika Anda menghapus "
dari $(cat /tmp/test.txt)
Anda membaca file kata demi kata daripada satu tegukan. Juga mungkin bukan apa yang dimaksudkan ...)
Cara paling kuat dan paling sederhana untuk membaca file baris demi baris dan mempertahankan semua spasi adalah:
$ while IFS= read -r line || [[ -n $line ]]; do printf "'%s'\n" "$line"; done </tmp/test.txt
'Line 1'
' Line 2 has leading space'
'Line 3 followed by blank line'
''
'Line 5 (follows a blank line) and has trailing space '
'Line 6 has no ending CR'
Jika Anda ingin menghapus ruang utama dan perdagangan, hapus IFS=
bagian tersebut:
$ while read -r line || [[ -n $line ]]; do printf "'%s'\n" "$line"; done </tmp/test.txt
'Line 1'
'Line 2 has leading space'
'Line 3 followed by blank line'
''
'Line 5 (follows a blank line) and has trailing space'
'Line 6 has no ending CR'
(File teks tanpa terminasi \n
, sementara cukup umum, dianggap rusak di bawah POSIX. Jika Anda dapat mengandalkan trailing, \n
Anda tidak perlu || [[ -n $line ]]
dalam while
loop.)
Lebih banyak di BASH FAQ