Aku punya ini:
sed -i '/^$/d' temp_spec.rb
yang melucuti garis kosong dan berfungsi dengan baik. Bagaimana saya bisa membuatnya hanya melakukan ini untuk baris 5-999 (atau idealnya 5 hingga akhir-file).
Saya mencoba:
sed -n5,999 -i '/^$/d' temp_spec.rb
sed '5,999!d/^$/d' temp_spec.rb
tapi tidak ada yang berhasil (tidak ada kesalahan).
Jawaban:
Jika Anda ingin menghapus semua baris kosong yang dimulai dengan baris 5 dan menjaga baris 1 hingga 4, Anda dapat menggunakannya
Ini
{
adalah operator pengelompokan, sehingga perintah pertama5,${
berarti "dari baris 5 hingga akhir input ($
) jalankan perintah berikut hingga pencocokan}
". Perintah di antara{
dan}
lagi dapat diawali dengan alamat, sehingga perintah dalam/^$/d
berarti "jika tidak ada antara awal (^
) dan akhir ($
) dari baris, hapus itu". Perintah sed dapat dipisahkan dengan;
. (Ini adalah fitur sed yang tidak terdokumentasi. Ini didukung oleh sebagian besar implementasi sed, tetapi tidak sepenuhnya portabel .) Seperti dicatat oleh Hauke,;
after{
adalah opsional; yang sebelumnya}
diperlukan.Jika Anda ingin menghapus semua baris kosong yang dimulai dengan baris 5 dan juga menghapus baris 1 hingga 4, lebih mudah:
sumber
;
.;
.Opsi lain menggunakan awk:
sumber
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 adalaht
cara sedif ... then
.T
akan lebih mudah tetapi hanya tersedia untuk GNU sed. Saya mengutip halaman manual: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 perintahd
harus dijalankan. Kalau tidak, tidak ada yang harus dilakukan. Karenat
tidak melompat jika adas
tindakan saya perlu perintah cabangb
untuk melompat ke akhir skrip.: label
adalah target cabang. Sepertigoto
saat itu di zaman kegelapan (ketika sed ditemukan ... te-hee).Pilihan lain adalah
s
"mengganti" semua baris yang tidak kosong, menjadikan perintah yangs
lebih rumit tetapi lebih mudah:^..*$
berarti "baris tidak kosong" dan\1
berarti "isi tanda kurung pertama".sumber