sed '5,${s/^$//; t delete; b end; : delete; d; : end;}' temp_spec.rb
Editar 1:
Se supone que debo explicar esto, así ...
Esto es innecesariamente complicado. No sabía que los rangos de direcciones están permitidos dentro {}
. Así que tuve que expresar "eliminar líneas vacías" de manera diferente. El comando central es t
cuál es la forma de sed if ... then
. T
hubiera sido más fácil pero está disponible solo para GNU sed. Cito la página del manual:
etiqueta t: si as /// ha realizado una sustitución exitosa desde que se leyó la última línea de entrada y desde el último comando t o T, entonces bifurca a etiqueta; Si se omite la etiqueta, bifurca hasta el final del guión.
Abuso del famoso s
comando. No reemplazará nada, solo probará si la línea está vacía. Por lo tanto, reemplaza una línea vacía por una línea vacía (podría usar cualquier cosa como reemplazo ya que la línea se elimina de todos modos).
Si s
ha hecho un "reemplazo", entonces la línea está vacía. En ese caso d
se ejecutará el comando . De lo contrario, no se debe hacer nada. Como t
no salta en caso de una s
acción, necesito el comando de bifurcación b
para saltar al final del guión. : label
son objetivos de sucursal. Como en goto
aquel entonces en la edad oscura (cuando se inventó sed ... te-hee).
Otra opción sería tener s
"reemplazar" todas las líneas no vacías, haciendo s
más fácil el resto del comando pero más complicado:
sed '5,${s/^\(..*\)$/\1/; t end; d; : end;}' input
^..*$
significa "línea no vacía" y \1
significa "el contenido de los primeros corchetes".