Sed gantikan melalui kalimat pada banyak baris

11

Saya baru menggunakan sed tetapi saya telah bereksperimen dengan sed s/..../..../(pengganti) untuk mengubah kalimat lengkap jika itu dalam satu baris tetapi saya tidak mengetahui solusi alternatif tentang bagaimana mengubah sebuah kalimat yang mungkin telah dipisahkan pada dua baris seperti:

Ini:

Lorem Ipsum is simply dummy text of the printing and typesetting industry.

sebenarnya ditulis sebagai ini:

Lorem Ipsum is simply dummy text of the 
printing and typesetting industry.

Bagaimana Anda bisa mendeteksi ini atau mengkodekannya untuk mengganti seluruh kalimat walaupun itu ada di dua baris, bukan satu?

DᴀʀᴛʜVᴀᴅᴇʀ
sumber
Buku referensi hebat: Panduan Definitif untuk Tutorial dan Referensi oleh Daniel A. Goldman ISBN: 978-1-939824-01-1 (versi EPUB) 08148804441822
Joe

Jawaban:

16

Perintah berikut akan bekerja di kedua situasi:

sed '/Lorem.*/ {N; s/Lorem.*industry\./string to replace/g}' filename

Lebih banyak penjelasan: Bagaimana saya bisa menggunakan sed untuk mengganti string multi-line?

Radu Rădeanu
sumber
3
@Gilles Saya mengerti niat baik Anda, tapi tolong coba untuk menguji sebelum mengacaukan jawaban saya. Lebih baik, jika Anda memiliki pendapat lain, adalah menambahkan jawaban lain atau meninggalkan komentar.
Radu Rădeanu
Selamat datang di Stack Exchange. Situs ini diedit secara kolaboratif. Jika Anda merasa tidak nyaman dengan gagasan kontribusi Anda diedit secara kolaboratif oleh pengguna tepercaya lainnya, ini mungkin bukan situs untuk Anda. Saya perhatikan bahwa kode Anda diganti lebih dari frasa spesifik yang dimaksudkan, jadi saya mengedit frasa.
Gilles 'SO-stop being evil'
@Gilles Tolong, kamu tidak perlu nakal. Anda juga harus memperhatikan bahwa "kode" Anda tidak menggantikan apa pun . Seperti yang saya katakan, saya mengerti niat baik Anda. Dari contoh saya, saya kira bahwa OP untuk memahami cara mengganti melalui kalimat pada beberapa baris dengan sed, tidak lebih. Dan ini adalah pertanyaan judul. Judulnya bukan tentang perl.
Radu Rădeanu
Tidak, kode yang saya posting tidak berfungsi. (Kecuali jika Loremada di baris terakhir, cacat itu berbagi dengan versimu.)
Gilles 'SO-stop being evil'
Contoh ini tidak berfungsi ketika ada 3 atau lebih baris teks :(
artnikpro
12

Sementara sed dapat mencocokkan pola pada banyak baris (menggunakan perintah Natau Huntuk menambahkan baris berturut-turut sebelum cocok), ini jauh di luar zona nyamannya. Coba saja jika Anda suka rasa sakit.

Perl dapat melakukan hal-hal semacam ini dengan baik. Gunakan -psakelar untuk membuatnya memproses input standar satu rekaman pada satu waktu dan mencetak catatan yang dimodifikasi (à la sed), dan -000untuk mengaktifkan mode paragraf (di mana catatan dipisahkan oleh garis kosong). Dalam ekspresi reguler, \scocok dengan karakter spasi putih termasuk baris baru.

perl -p -000 -e 's/Lorem\s+Ipsum\s+is\s+simply\s+dummy\s+text\s+of\s+the\s+printing\s+and\s+typesetting\s+industry\./Replacement text/g'

Jika Anda ingin meletakkan baris baru di teks pengganti ketika yang asli berisi, itu lebih rumit. Cara melakukannya tergantung pada kebutuhan Anda ke mana harus meletakkan baris baru.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
@terdon Ah, saya bermaksud mengizinkan beberapa spasi putih tapi lupa. Terima kasih sudah diperbaiki.
Gilles 'SO- stop being evil'
Pertanyaannya adalah tentang sed. Itu juga ditandai dengan sed, bukan dengan perl.
Radu Rădeanu
0

sed tidak dapat dengan mudah membaca melintasi beberapa baris. Gunakan perl -i -0pe 's/.../.../...'sebagai gantinya.

Melakukan
sumber
7
sed dapat membaca melintasi beberapa baris!
Radu Rădeanu
3
@ RaduRădeanu Secara teknis, ya. Tapi itu jarang sepadan dengan masalahnya.
Gilles 'SO- stop being evil'
3
@Gilles Jika menggunakan perllebih sederhana untuk Anda, ini tidak berarti bahwa sedjarang sepadan dengan masalahnya.
Radu Rădeanu