sed '5,${s/^$//; t delete; b end; : delete; d; : end;}' temp_spec.rb
Modifier 1:
Je suis censé expliquer cela, donc ...
C'est inutilement compliqué. Je ne savais pas que les plages d'adresses sont autorisées à l'intérieur {}. J'ai donc dû exprimer «supprimer les lignes vides» différemment. La commande principale est tcelle de sed if ... then. Taurait été plus facile mais n'est disponible que pour GNU sed. Je cite la page de manuel:
étiquette t: si as /// a effectué une substitution réussie depuis la lecture de la dernière ligne d'entrée et depuis la dernière commande t ou T, branchez-vous sur étiquette; si l'étiquette est omise, branchez-vous à la fin du script.
J'abuse de la fameuse scommande. Il ne remplacera rien mais testera seulement si la ligne est vide. Donc, il remplace une ligne vide par une ligne vide (pourrait utiliser n'importe quoi comme remplacement car la ligne est supprimée de toute façon).
Si sa fait un "remplacement" alors la ligne est vide. Dans ce cas, la commande ddoit être exécutée. Sinon, rien ne doit être fait. Comme tne saute pas en cas d' saction j'ai besoin de la commande branch bpour sauter à la fin du script. : labelsont des cibles de branche. Comme gotoà l'époque dans les âges sombres (quand sed a été inventé ... te-hee).
Une autre option serait de s"remplacer" toutes les lignes non vides, ce qui rend la commande splus compliquée mais plus simple:
sed '5,${s/^\(..*\)$/\1/; t end; d; : end;}' input
^..*$signifie "ligne non vide" et \1signifie "le contenu des premières parenthèses".