sed '5,${s/^$//; t delete; b end; : delete; d; : end;}' temp_spec.rb
Bearbeiten 1:
Ich soll das erklären, also ...
Das ist unnötig kompliziert. Ich wusste nicht, dass Adressbereiche innerhalb erlaubt sind {}. Also musste ich "leere Zeilen löschen" anders ausdrücken. Der Kernbefehl ist tder von sed if ... then. Twäre einfacher gewesen, ist aber nur für GNU sed verfügbar. Ich zitiere die Manpage:
t label: Wenn as /// eine erfolgreiche Ersetzung seit dem Lesen der letzten Eingabezeile und seit dem letzten t- oder T-Befehl durchgeführt hat, verzweigen Sie zu label. Wenn die Bezeichnung weggelassen wird, verzweigen Sie zum Ende des Skripts.
Ich missbrauche den berühmten sBefehl. Es soll nichts ersetzen, sondern nur prüfen, ob die Leitung leer ist. Es ersetzt also eine leere Zeile durch eine leere Zeile (könnte alles als Ersatz verwenden, da die Zeile sowieso gelöscht wird).
Wenn sein "Ersatz" durchgeführt wurde, ist die Zeile leer. In diesem Fall muss der Befehl dausgeführt werden. Sonst ist nichts zu tun. Da tim Falle einer sAktion nicht gesprungen wird, muss der Verzweigungsbefehl bzum Ende des Skripts springen. : labelsind Zweigziele. Wie gotodamals in den dunklen Zeiten (als sed erfunden wurde ... te-hee).
Eine andere Möglichkeit wäre, salle nicht leeren Zeilen zu "ersetzen", was den skomplizierteren, aber den Rest des Befehls einfacher macht:
sed '5,${s/^\(..*\)$/\1/; t end; d; : end;}' input
^..*$bedeutet "nicht leere Zeile" und \1bedeutet "den Inhalt der ersten Klammern".