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 t
celle de sed if ... then
. T
aurait é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 s
commande. 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 s
a fait un "remplacement" alors la ligne est vide. Dans ce cas, la commande d
doit être exécutée. Sinon, rien ne doit être fait. Comme t
ne saute pas en cas d' s
action j'ai besoin de la commande branch b
pour sauter à la fin du script. : label
sont 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 s
plus compliquée mais plus simple:
sed '5,${s/^\(..*\)$/\1/; t end; d; : end;}' input
^..*$
signifie "ligne non vide" et \1
signifie "le contenu des premières parenthèses".