sed '5,${s/^$//; t delete; b end; : delete; d; : end;}' temp_spec.rb
Edycja 1:
Mam to wyjaśnić, a zatem ...
Jest to niepotrzebnie skomplikowane. Nie wiedziałem, że zakresy adresów są dozwolone w obrębie {}. Musiałem więc inaczej wyrazić „usuń puste linie”. Podstawowym poleceniem tjest sed if ... then. Tbyłoby łatwiejsze, ale jest dostępne tylko dla GNU sed. Cytuję stronę podręcznika:
etykieta t: Jeśli as /// dokonał pomyślnego podstawienia od ostatniego odczytu linii wejściowej i od ostatniego polecenia t lub T, to należy przejść do etykiety; jeśli etykieta zostanie pominięta, przejdź do końca skryptu.
Nadużywam słynnego spolecenia. Nie zastępuje niczego, tylko sprawdza, czy linia jest pusta. Zastępuje więc pustą linię pustą linią (może wykorzystać wszystko jako zamiennik, ponieważ i tak linia jest usuwana).
Jeśli sdokonano „zamiany”, to linia jest pusta. W takim przypadku polecenie dzostanie wykonane. W przeciwnym razie nic nie można zrobić. Ponieważ tnie przeskakuje w przypadku sakcji, potrzebuję polecenia gałęzi, baby przejść do końca skryptu. : labelsą celami branżowymi. Jak gotowtedy w ciemnych czasach (kiedy wynaleziono sed ... te-hee).
Inną opcją byłoby s„zastąpienie” wszystkich niepustych linii, dzięki czemu sbardziej skomplikowana, ale reszta polecenia jest łatwiejsza:
sed '5,${s/^\(..*\)$/\1/; t end; d; : end;}' input
^..*$oznacza „niepustą linię” i \1„treść pierwszych nawiasów”.