2012-09-26 20 views
18

Encontré esto question and answer sobre cómo eliminar las líneas triples vacías. Sin embargo, necesito lo mismo solo para líneas dobles vacías. Es decir. todas las líneas dobles en blanco deben borrarse por completo, pero deben conservarse líneas en blanco individuales.Cómo usar sed para eliminar solo las líneas dobles vacías?

Conozco un poco de sed, pero el comando propuesto para la eliminación de líneas en blanco triple es sobre mi cabeza:

sed '1N;N;/^\n\n$/d;P;D'

+2

¿qué hay de las líneas triples y más en blanco? – xdazz

+0

@xdazz: sí, estaría bien para líneas triples o más en blanco. – marlar

Respuesta

10

he comentado el comando sed no entiende:

sed ' 
    ## In first line: append second line with a newline character between them. 
    1N; 
    ## Do the same with third line. 
    N; 
    ## When found three consecutive blank lines, delete them. 
    ## Here there are two newlines but you have to count one more deleted with last "D" command. 
    /^\n\n$/d; 
    ## The combo "P+D+N" simulates a FIFO, "P+D" prints and deletes from one side while "N" appends 
    ## a line from the other side. 
    P; 
    D 
' 

Retire 1N porque necesitamos sólo dos líneas en la 'pila' y es enought con el segundo N, y cambiar /^\n\n$/d;-/^\n$/d; para eliminar las dos líneas en blanco consecutivas.

Una prueba:

contenido de infile:

1 


2 
3 

4 



5 

6 


7 

Ejecutar el comando sed:

sed ' 
    N; 
    /^\n$/d; 
    P; 
    D 
' infile 

que los rendimientos:

1 
2 
3 

4 

5 

6 
7 
+2

Muchas gracias, este comando lo hace: sed 'N;/^ \ n $/d; P; D' – marlar

+0

Para todos los que quieran usar esto, no olviden la opción 'sed -i' para cambiar eso inmediatamente en el archivo en lugar de enviar el resultado a la salida. – jan

4

Esto se ab e más fácil con awk:

awk -v RS='\n\n\n' 1 
4
sed '/^$/{N;/^\n$/d;}' 

Se borrará sólo dos líneas en blanco consecutivos en un archivo. Puede usar esta expresión solo en el archivo, entonces solo usted puede comprender completamente. Cuando llegue una línea en blanco, entrará en llaves.

Normalmente, sed leerá una línea. N agregará la segunda línea al espacio del patrón. Si esa línea es línea vacía. las dos líneas están separadas por nueva línea.

/^\n$/ este patrón coincidirá con el tiempo que solo el d funcionará. Else d no funciona. d se utiliza para eliminar el espacio de patrón de todo el contenido y luego iniciar el siguiente ciclo.

+0

He intentado este comando y elimina el exceso de nuevas líneas (algunas de las múltiples nuevas líneas se eliminan por completo en lugar de ser reemplazadas por una nueva línea). No estoy seguro de por qué sucede esto, así que ten cuidado. – waldyrious

+0

sed 'N;/^ \ n $/D; P; D;' parece funcionar mejor y elimina solo nuevas líneas consecutivas –

36

Esto sería más fácil con cat:

cat -s 
+0

Bueno, pero no hace exactamente lo mismo. Sin embargo, no sabía esta opción y es muy útil, así que gracias de todos modos. – marlar

+2

Nunca supe de esto tampoco, pero era exactamente lo que necesitaba. Buen descubrimiento. –

+1

Para los curiosos: http://explainshell.com/explain?cmd=cat+-s – waldyrious

-2

Sólo tubería a comandos 'uniq' y todas las líneas vacías sin importar el número de ellos se redujeron a sólo uno. Más simple es mejor.

Aclaración: como dijo Marlar, esto no es una solución si tiene "otras líneas duplicadas consecutivas no en blanco" de las que no desea deshacerse. Esta es una solución en otros casos, como cuando trato de limpiar los archivos de configuración, que era la solución que estaba buscando cuando vi esta pregunta. Solucioné mi problema simplemente usando 'uniq'.

+3

¡A veces puede ser demasiado simple! Si la fuente contiene entradas duplicadas, también se eliminarán. Esa no es una solución aceptable. – marlar

Cuestiones relacionadas