Jawaban cepat
sed ':a;N;$!ba;s/\n/ /g' file
- : a buat label 'a'
- N menambahkan baris berikutnya ke ruang pola
- $! jika bukan baris terakhir , ba cabang (buka) beri label 'a'
- s pengganti , / \ n / regex untuk baris baru , / / oleh ruang , / g pertandingan global (sebanyak yang bisa)
sed akan loop melalui langkah 1 hingga 3 hingga mencapai baris terakhir, mendapatkan semua baris pas di ruang pola di mana sed akan menggantikan semua \ n karakter
Alternatif
Semua alternatif, tidak seperti sed tidak perlu mencapai baris terakhir untuk memulai proses
dengan bash , lambat
while read line; do printf "%s" "$line "; done < file
dengan perl , kecepatan sed- like
perl -p -e 's/\n/ /' file
dengan tr , lebih cepat dari sed , dapat diganti dengan satu karakter saja
tr '\n' ' ' < file
dengan tempel , kecepatan mirip tr , dapat diganti dengan satu karakter saja
paste -s -d ' ' file
dengan awk , tr- like speed
awk 1 ORS=' ' file
Alternatif lain seperti "echo $ (<file)" lambat, hanya berfungsi pada file kecil dan perlu memproses seluruh file untuk memulai proses.
5.10. Mengapa saya tidak dapat mencocokkan atau menghapus baris baru menggunakan
urutan melarikan diri \ n ? Mengapa saya tidak dapat mencocokkan 2 baris atau lebih menggunakan \ n?
\ N tidak akan pernah cocok dengan baris baru di akhir baris karena
baris baru selalu dibuka sebelum baris ditempatkan ke dalam
ruang pola. Untuk mendapatkan 2 garis atau lebih ke dalam ruang pola, gunakan
perintah 'N' atau yang serupa (seperti 'H; ...; g;').
Sed berfungsi seperti ini: sed membaca satu baris pada satu waktu, memotong
baris yang mengakhiri, menempatkan apa yang tersisa ke ruang pola di mana
skrip sed dapat mengatasi atau mengubahnya, dan ketika ruang pola
dicetak, menambahkan baris baru ke stdout (atau ke file). Jika
ruang pola dihapus seluruhnya atau sebagian dengan 'd' atau 'D',
baris baru tidak ditambahkan dalam kasus tersebut. Jadi, skrip suka
sed 's/\n//' file # to delete newlines from each line
sed 's/\n/foo\n/' file # to add a word to the end of each line
akan TIDAK PERNAH bekerja, karena baris baru trailing dihapus sebelum
garis dimasukkan ke dalam ruang pola. Untuk melakukan tugas di atas,
gunakan salah satu skrip ini sebagai gantinya:
tr -d '\n' < file # use tr to delete newlines
sed ':a;N;$!ba;s/\n//g' file # GNU sed to delete newlines
sed 's/$/ foo/' file # add "foo" to end of each line
Karena versi sed selain GNU sed memiliki batasan ukuran
buffer pola, utilitas Unix 'tr' lebih disukai di sini.
Jika baris terakhir file berisi baris baru, GNU sed akan menambahkan
baris baru ke output tetapi
menghapus semua baris lainnya, sedangkan tr akan menghapus semua baris baru.
Untuk mencocokkan satu blok dengan dua baris atau lebih, ada 3 pilihan dasar:
(1) gunakan perintah 'N' untuk menambahkan baris Berikutnya ke ruang pola;
(2) gunakan perintah 'H' setidaknya dua kali untuk menambahkan garis saat ini
ke ruang Tahan, dan kemudian mengambil garis dari ruang tahan
dengan x, g, atau G; atau (3) menggunakan rentang alamat (lihat bagian 3.3, di atas)
untuk mencocokkan garis antara dua alamat yang ditentukan.
Pilihan (1) dan (2) akan menempatkan \ n ke dalam ruang pola, di mana ia
dapat dialamatkan sesuai keinginan ('s / ABC \ nXYZ / alfabet / g'). Salah satu contoh
menggunakan 'N' untuk menghapus blok garis muncul di bagian 4.13
("Bagaimana cara menghapus blok baris berturut - turut tertentu ?").
Contoh ini dapat dimodifikasi dengan mengubah perintah hapus ke sesuatu yang
lain, seperti 'p' (cetak), 'i' (masukkan), 'c' (ubah), 'a' (tambahkan),
atau 's' (pengganti) .
Choice (3) tidak akan menempatkan \ n ke dalam ruang pola, tetapi tidak
cocok dengan blok garis berturut-turut, sehingga mungkin bahwa Anda tidak
bahkan perlu \ n untuk menemukan apa yang Anda cari. Karena GNU sed
versi 3.02.80 sekarang mendukung sintaks ini:
sed '/start/,+4d' # to delete "start" plus the next 4 lines,
selain alamat rentang tradisional '/ dari sini /, / ke sana / {...}
, dimungkinkan untuk menghindari penggunaan \ n seluruhnya.
tr
hanya alat yang tepat untuk pekerjaan itu jika mengganti satu karakter untuk satu karakter, sedangkan contoh di atas menunjukkan ganti baris baru dengan spasi .. Jadi dalam contoh di atas, tr bisa bekerja .. Tetapi akan membatasi nanti.