sed '5,${s/^$//; t delete; b end; : delete; d; : end;}' temp_spec.rb
Düzenleme 1:
Bunu açıklamam gerekiyor, bu yüzden ...
Bu gereksiz bir şekilde karmaşık. Adres aralıklarına izin verildiğini bilmiyordum {}. Bu yüzden "boş satırları sil" i farklı şekilde ifade etmek zorunda kaldım. Çekirdek komut tsed'in yoludur if ... then. Tdaha kolay olurdu, ancak yalnızca GNU sed için kullanılabilir. Adam sayfasına atıfta bulunuyorum:
t label: as ///, son giriş satırı okunduğundan ve son t veya T komutundan bu yana başarılı bir değişiklik yaptıysa, etiketlemek için dallayın; etiket atlanırsa, komut dosyasının sonuna dallanır.
Ünlü semri kötüye kullanıyorum . Hiçbir şeyin yerini almaz, sadece hattın boş olup olmadığını test eder. Böylece boş bir satırı boş bir satırla değiştirir (her halükarda silindiğinden herhangi bir şeyi yedek olarak kullanabilir).
Eğer sbir "değiştirme" yapmışsa, çizgi boştur. Bu durumda komut dyürütülür. Aksi takdirde hiçbir şey yapılmaz. tBir seylem durumunda atlama değil gibi ben komut bdosyasının sonuna atlamak için şube komut gerekir . : labelşube hedefleridir. Gibi gotoo zamanlar karanlık çağlarda (... te-hee icat edildi sed olduğunda).
Başka bir seçenek de s, boş olmayan tüm satırları "değiştirmek", sdaha karmaşık ama komutun geri kalanını kolaylaştırmak olacaktır:
sed '5,${s/^\(..*\)$/\1/; t end; d; : end;}' input
^..*$"boş olmayan satır" ve \1"ilk köşeli parantezlerin içeriği" anlamına gelir.