Saya harus mengganti blok besar teks (kode skrip shell) dalam file dengan blok teks lain.
Saya terkesan dengan Bagaimana saya bisa menggunakan sed untuk mengganti string multi-baris? dijawab oleh
antak dan ganti Multi-baris dijawab oleh Bruce Ediger
Tapi saya kesulitan menggunakannya.
-
antak sudah menyebutkan dalam jawabannya bahwa streaming seluruh file (
1h;2,$H;$!d;g;
) ke buffer tidak disarankan untuk file besar, karena membebani memori. -
Saya tahu
sed
dapat digunakan dengan fitur blok untuk mempertahankan teks di luar blok tidak berubah. Saya ingin menggunakan fitur ini. Tapi jika saya menggunakan,sed -i '/marker1/,/marker2/s/.*/new text (code)/' filename
itu akan menyisipkan teks (kode) baru berulang kali untuk setiap aliran. Maka dari itu saya harus membuat blok visual sebagai satu aliran, menggunakan sesuatu yang mirip dengan apa yang disarankan oleh antak sebelumnya, tetapi untuk blok (bukan untuk seluruh file).
-
Seperti yang disebutkan oleh Bruce Ediger, tambahkan fitur
ex
yang dimulai dengana
diakhiri dengan.
(titik) dapat dicoba, tetapi teks (kode) baru saya berisi baris yang dimulai dengan titik, yang dapat dianggap sebagai titik dari sintaks tambahan. Bagaimana saya bisa menggunakannya dalam situasi ini? -
ex
dd
'number of lines' dapat menghapus beberapa baris, tetapi jika saya memiliki blok antara /marker1/ dan /marker2/ dengan jumlah baris yang tidak tetap (bervariasi) harus diganti dengan teks (kode) baru, bagaimana caranya?
Jawaban yang Diterima:
Saya sarankan menggunakan c perintah hange
(yang pada dasarnya adalah d elete digabungkan dengan a ppend, meskipun append hanya diterapkan untuk baris terakhir dalam rentang yang persis seperti yang Anda inginkan di sini):
sed -i '/marker1/,/marker2/c
New text 1
New text 2' filename
Di sini menggunakan GNU sed
sintaks untuk pengeditan di tempat (-i
). c
. itu perintah sebaliknya standar dan portabel. GNU sed
mendukung:
sed '/marker1/,/marker2/cNew text 1
New text 2' filename
sebagai ekstensi non-standar.
Karakter baris baru dan garis miring terbalik harus diloloskan (dengan garis miring terbalik) dalam teks pengganti.