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-line? dijawab oleh antak dan Multi-line replace dijawab oleh Bruce Ediger
Tetapi saya memiliki beberapa kesulitan dalam menggunakannya.
antak sudah disebutkan dalam jawabannya bahwa streaming seluruh file (
1h;2,$H;$!d;g;
) ke buffer tidak disarankan untuk file besar, karena kelebihan memori.Saya tahu
sed
dapat digunakan dengan fitur blok untuk mempertahankan teks di luar blok tidak berubah. Saya ingin menggunakan fitur ini. Tetapi jika saya menggunakan,sed -i '/marker1/,/marker2/s/.*/new text (code)/' filename
itu akan menyisipkan teks (kode) baru berulang kali untuk setiap aliran. Karenanya 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, append fitur
ex
yang dimulai dengana
diakhiri dengan.
(titik) dapat dicoba, tetapi teks baru saya (kode) berisi baris dimulai dengan titik, yang dapat dianggap sebagai titik sintaks append. Bagaimana saya bisa menggunakannya dalam situasi ini?ex
'dd
Jumlah baris' dapat menghapus banyak baris, tetapi jika saya memiliki blok antara / marker1 / dan / marker2 / dengan jumlah baris yang tidak diperbaiki (bervariasi) harus diganti dengan teks (kode) baru, bagaimana caranya Itu ?
sed
atauex
perintah bekerja).r
perintah file read, untuk menyalin teks dari file lain, jika sumber untuk teks pengganti ada dalam file.Jawaban:
Saya sarankan menggunakan c perintah hange (yang pada dasarnya adalah d apus ditambah dengan sebuah ppend, meskipun append tersebut hanya diterapkan untuk baris terakhir dalam kisaran yang tepat apa yang Anda inginkan di sini):
Di sini menggunakan
sed
sintaksis GNU untuk pengeditan di tempat (-i
). Ituc
perintah jika tidak standar dan portabel. GNUsed
mendukung:sebagai ekstensi non-standar.
Karakter baris baru dan garis miring terbalik harus diloloskan (dengan garis miring terbalik) dalam teks pengganti.
sumber
sed
danex
sama - sama. Terima kasih banyak.sed
seperti dalam kasusex
sintaks yang disarankan oleh Bruce Ediger di Multi-line replace .r
perintah yang dibahas dalam jawaban lain untuk pertanyaan itu. Saya tidak yakin bagaimana Anda akan menggunakan dokumen di sinised
.Menggunakan GNU sed
Untuk mengganti garis, mulailah pencocokan garis
3
dan lanjutkan ke pencocokan garis5
denganNew Code
:Untuk garis dalam rentang
/3/,/5/
, kami menguji untuk melihat apakah garis cocok5
(artinya ini adalah baris terakhir dalam grup) dan, jika demikian, kami melakukan substitusi untuk menyisipkanNew Code
. Jika substitusi dibuat, makat
perintah itu memberitahu sed untuk melompat ke akhir perintah (dalam halNew Code
ini dicetak). Jika tidak,d
perintah itu memberitahu sed untuk menghapus baris.Semua garis lainnya dicetak secara normal.
Untuk mengubah file di tempat,
-i
opsi dapat digunakan:Menggunakan awk
Untuk melakukan hal yang sama menggunakan awk:
Perintah awk memperlakukan baris dalam kisaran
/3/,/5/
secara khusus. Untuk garis dalam rentang itu, kami menguji untuk melihat apakahf
nol (yaitu, jika!f
benar) dan, jika demikian, kami mencetakNew Code
dan mengaturf
ke 1 dan kemudian kami melewatkan sisa perintah dan melompat kenext
garis.Untuk garis di luar rentang
/3/,/5/
, tidak ada lompatan yang dilakukan dan1
menyebabkan garis yang akan dicetak. Lebih rinci,1
adalah suatu kondisi. Karena1
bukan nol, kondisi dievaluasi ke true. Karena tidak ada tindakan yang dikaitkan dengan kondisi tersebut, tindakan default dilakukan yaitu mencetak garis. Demikianlah1
singkatan untuk print-the-line.Untuk mengubah file di tempat,
-i inplace
opsi dapat digunakan dengan GNUawk
4.1 atau lebih tinggi:sumber
awk
, bisakah Anda menjelaskan sedikitawk
ekspresi Andased '/3/,/4/d;/5/cNew Code'
awk '/5/{print "New Code"}/3/,/5/{next}1'
Berdasarkan pembahasan di atas saya datang dengan solusi menggunakan
ex
Di atas memberi
Terima kasih g-man membuat saya menyadari perintah perubahan dan memberikan klarifikasi tentang titik. Keduanya
sed
danex
berbagi sintaks yang hampir mirip untuk perintah perubahan (juga untuk perintah hapus, tambahkan perintah, dll).sumber