2010-05-27 19 views
6

Tengo un documento que contiene líneas vacías (\ n \ n). Se pueden eliminar con sed:¿Cómo reemplazo varias líneas nuevas con una sola con Perl's Regular Expressions?

echo $'a\n\nb'|sed -e '/^$/d' 

Pero, ¿cómo puedo hacer eso con una expresión regular común en Perl? Cualquier cosa como la siguiente simplemente no muestra ningún resultado.

echo $'a\n\nb'|perl -p -e 's/\n\n/\n/s' 
+4

Si lo necesita como filtro para la creación de scripts en shell, como suponen los ejemplos, suponga que sería más rápido y más compatible con 'cat -s'. – Marian

+0

@Marian Gracias por señalarlo. Me di cuenta de que nunca había leído 'hombre gato' hasta hoy. –

+0

@Marian Ya no lo necesito como entrada; Pero, sin embargo, gracias por señalar eso. Puede que lo esté usando en el futuro :) –

Respuesta

13

Es necesario utilizar s/^\n\z//. La entrada se lee por línea, por lo que nunca obtendrá más de una nueva línea. En su lugar, elimine las líneas que no contienen otros caracteres. Usted debe invocar perl usando

perl -ne 's/^\n\z//; print' 

Sin necesidad de que el interruptor de /s.

+1

Esto es más agradable que sorber en todo el archivo a la vez, lo cual no es una buena idea si el archivo es realmente grande. – Ether

+1

Simple y eficiente –

+0

Una forma ligeramente diferente de hacer esto es 'perl -pne 's/^ \ n \ z //'. No hay necesidad de 'print' con la opción' -p'. – steveb

4

La entrada tiene tres líneas separadas, y perl con la opción -p solo procesa una línea a la vez.

La solución alternativa es indicar perl para sorber en varias líneas de entrada a la vez. Una forma de hacerlo es:

echo $'a\n\nb' | perl -pe 'BEGIN{$/=undef}; s/\n\n/\n/' 

Aquí $/ es el record separator variable, que dice Perl cómo analizar un flujo de entrada en las líneas.

6

El problema más estrecha de no imprimir líneas en blanco es más directo:

$(input) | perl -ne 'print if /\S/' 

es la salida todas las líneas excepto los que sólo contienen espacios en blanco.

Cuestiones relacionadas