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 tcara sed if ... then. Takan 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 sperintah 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 stelah melakukan "penggantian" maka saluran kosong. Dalam hal ini perintah dharus dijalankan. Kalau tidak, tidak ada yang harus dilakukan. Karena ttidak melompat jika ada stindakan saya perlu perintah cabang buntuk melompat ke akhir skrip. : labeladalah target cabang. Seperti gotosaat itu di zaman kegelapan (ketika sed ditemukan ... te-hee).
Pilihan lain adalah s"mengganti" semua baris yang tidak kosong, menjadikan perintah yang slebih rumit tetapi lebih mudah:
sed '5,${s/^\(..*\)$/\1/; t end; d; : end;}' input
^..*$berarti "baris tidak kosong" dan \1berarti "isi tanda kurung pertama".