Tengo esto:
sed -i '/^$/d' temp_spec.rb
que está eliminando líneas en blanco y funciona bien. ¿Cómo puedo hacer que solo haga esto para las líneas 5-999 (o idealmente 5 para el final del archivo)?
Lo intenté:
sed -n5,999 -i '/^$/d' temp_spec.rb
sed '5,999!d/^$/d' temp_spec.rb
pero ninguno funcionó (sin errores).

Respuestas:
Si desea eliminar todas las líneas en blanco que comienzan con la línea 5 y mantener las líneas 1 a 4, puede usar
El
{es el operador de agrupación, por lo que el primer comando5,${significa "desde la línea 5 hasta el final de input ($) ejecuta los siguientes comandos hasta la coincidencia}". Los comandos entre{y}pueden ser prefijados nuevamente por direcciones, por lo que el comando interno/^$/dsignifica "si no hay nada entre el principio (^) y el final ($) de la línea, elimínelo". Los comandos Sed se pueden separar por;. (Esta es una característica mal documentada de sed. Es compatible con la mayoría de las implementaciones de sed, pero no es completamente portátil ). Como señaló Hauke, el;after{es opcional; el anterior}se requiere, sin embargo.Si desea eliminar todas las líneas en blanco que comienzan con la línea 5 y también eliminar las líneas 1 a 4, es más fácil:
fuente
;.;.Otra opción con awk:
fuente
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 estcuál es la forma de sedif ... then.Thubiera sido más fácil pero está disponible solo para GNU sed. Cito la página del manual:Abuso del famoso
scomando. 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
sha hecho un "reemplazo", entonces la línea está vacía. En ese casodse ejecutará el comando . De lo contrario, no se debe hacer nada. Comotno salta en caso de unasacción, necesito el comando de bifurcaciónbpara saltar al final del guión.: labelson objetivos de sucursal. Como engotoaquel 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, haciendosmás fácil el resto del comando pero más complicado:^..*$significa "línea no vacía" y\1significa "el contenido de los primeros corchetes".fuente