Tidak perlu menempatkan label di :a
luar instruksi utama, begitu juga -e
opsi yang diperlukan; akhirnya, /$/
ini berlebihan (setiap baris memiliki karakter EOL).
Memperbaiki jawaban lain, satu mendapat
sed -i ':a; N; s/\n/ /; ta' file
Yang lebih jelas jika dituliskan sebagai berikut,
sed -i ':a
N
s/\n/ /
ta' file
Perintahnya bekerja sebagai berikut:
N
menambahkan baris berikutnya ke ruang pola (multiline), yang sudah berisi baris saat ini;
s/\n/ /
mengganti karakter baris baru yang \n
dihasilkan oleh N
dengan spasi
;
ta
pergi ke baris skrip mengikuti label :a
selama substitusi pada langkah 2 berhasil , yaitu jika substitusi terjadi, eksekusi melompat ke langkah 1 tanpa "memukul" akhir skrip, yaitu tanpa membaca baris input lain.
Perhatikan yang berikut ini;
sed
membaca baris file input satu per satu secara berurutan, mulai dari baris 1 ;
:a
hanyalah sebuah label, bukan perintah yang harus dieksekusi;
N
pada prinsipnya dieksekusi pada baris apa pun, tetapi
s/\n/ /
(pada prinsipnya dieksekusi pada baris apa pun) berhasil pada baris apa pun tetapi yang terakhir , jadi
ta
membuat akhir skrip dapat dijangkau hanya ketika baris input terakhir dibaca (satu-satunya baris yang s
gagal), jadi
- tidak ada baris input lebih lanjut dibaca ke dalam ruang pola setelah yang pertama dibaca ke dalamnya, kecuali yang terakhir dibaca, tetapi kemudian tidak ada baris lebih lanjut untuk dibaca, dan yang implisit
p
perintah dieksekusi.
Jadi skrip pada dasarnya membaca di baris pertama input dan terus menambahkan baris berikut satu per satu, setiap kali mengganti baris baru dengan spasi; setelah baris terakhir ditambahkan (dan \n
diubah dalam spasi), N
tidak dapat menambahkan baris apa pun, s
gagal, ta
dilewati, akhir skrip tercapai, dan p
pernyataan bidak tersirat dieksekusi pada ruang pola 1 baris looong saat ini .
The -i
pilihan pengganti file input file
dengan ruang pola 1-line secara keseluruhan.