GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Cara Menggunakan Sed Atau Ex Untuk Mengganti Blok (Kode multi-baris) Dengan Blok Teks (kode) Baru?

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.

  1. antak sudah menyebutkan dalam jawabannya bahwa streaming seluruh file (1h;2,$H;$!d;g; ) ke buffer tidak disarankan untuk file besar, karena membebani memori.

  2. 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).

  1. Seperti yang disebutkan oleh Bruce Ediger, tambahkan fitur ex yang dimulai dengan a 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?

  2. 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.


Linux
  1. Beberapa File Teks Ganti Dengan Sed?

  2. Cara menggunakan ekspor dengan Python di Linux

  3. Bagaimana melakukan sed like text ganti dengan python?

  1. Bagaimana cara menggunakan sed untuk mengganti variabel file konfigurasi?

  2. Cara menggunakan elemen teks di kanvas dengan font yang dijelaskan dalam CSS

  3. Multi-Line Sed Ganti

  1. Bagaimana saya menggunakan Vagrant dengan libvirt

  2. Bagaimana Cara Mengganti String Dalam File?

  3. Bagaimana cara mengganti karakter dengan sed secara rekursif?