sed '5,${s/^$//; t delete; b end; : delete; d; : end;}' temp_spec.rb
Edit 1:
Saya seharusnya menjelaskan ini, jadi ...
Ini tidak perlu rumit. Saya tidak tahu bahwa rentang alamat diizinkan di dalam {}
. Jadi saya harus mengekspresikan "hapus baris kosong" secara berbeda. Perintah inti adalah t
cara sed if ... then
. T
akan lebih mudah tetapi hanya tersedia untuk GNU sed. Saya mengutip halaman manual:
label t: Jika sebagai /// telah melakukan substitusi yang sukses sejak baris input terakhir dibaca dan sejak perintah t atau T terakhir, maka cabang ke label; jika label dihilangkan, cabang ke akhir skrip.
Saya menyalahgunakan s
perintah terkenal itu . Ini tidak akan menggantikan apa pun kecuali hanya menguji apakah saluran itu kosong. Jadi itu menggantikan baris kosong dengan baris kosong (bisa menggunakan apa pun sebagai pengganti sebagai garis dihapus pula).
Jika s
telah melakukan "penggantian" maka saluran kosong. Dalam hal ini perintah d
harus dijalankan. Kalau tidak, tidak ada yang harus dilakukan. Karena t
tidak melompat jika ada s
tindakan saya perlu perintah cabang b
untuk melompat ke akhir skrip. : label
adalah target cabang. Seperti goto
saat itu di zaman kegelapan (ketika sed ditemukan ... te-hee).
Pilihan lain adalah s
"mengganti" semua baris yang tidak kosong, menjadikan perintah yang s
lebih rumit tetapi lebih mudah:
sed '5,${s/^\(..*\)$/\1/; t end; d; : end;}' input
^..*$
berarti "baris tidak kosong" dan \1
berarti "isi tanda kurung pertama".