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/^$/d
significa "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 est
cuál es la forma de sedif ... then
.T
hubiera sido más fácil pero está disponible solo para GNU sed. Cito la página del manual: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 casod
se ejecutará el comando . De lo contrario, no se debe hacer nada. Comot
no salta en caso de unas
acción, necesito el comando de bifurcaciónb
para saltar al final del guión.: label
son objetivos de sucursal. Como engoto
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, haciendos
más fácil el resto del comando pero más complicado:^..*$
significa "línea no vacía" y\1
significa "el contenido de los primeros corchetes".fuente