2010-08-08 57 views

Respuesta

199

intente lo siguiente:

grep -v -e '^$' foo.txt 

La opción -e permite a los patrones de expresión regular para coincidir.

Las comillas simples alrededor de ^$ lo hacen funcionar para Cshell. Otros shells estarán contentos con comillas simples o dobles.

ACTUALIZACIÓN: Esto funciona para un archivo con líneas en blanco o "todo espacio en blanco" (como líneas de ventanas con terminaciones de línea de estilo "\ r \ n"), mientras que el anterior solo elimina archivos con líneas en blanco y unix los finales de línea de estilo:

grep -v -e '^[[:space:]]*$' foo.txt 
+0

sigue apareciendo líneas en blanco. –

+0

Ver la actualización de la pregunta. – ars

+0

Sí, eso funciona. También funciona con grep. –

1

yo prefiero usar egrep, aunque en mi prueba con un archivo genuina con su línea en blanco enfoque funcionó bien (aunque sin comillas en mi prueba). Esto funcionó demasiado:

egrep -v "^(\r?\n)?$" filename.txt 
+0

Intenté eso. Las líneas en blanco todavía se muestran. ¿Podría ser porque el archivo se creó en Windows? –

1

se esforzó pero esto parece funcionar (suponiendo \r que se muerde aquí)

printf "\r" | egrep -xv "[[:space:]]*" 
+0

Eso funciona si reemplazo la primera parte con la salida del archivo. –

22
$ dos2unix file 
$ grep -v "^$" file 

o simplemente awk

awk 'NF' file 

Si Don No tiene dos2unix, entonces puede usar herramientas como tr

tr -d '\r' < "$file" > t ; mv t "$file" 
+0

No se puede encontrar el programa dos2unix. ¿Es eso para Windows? el comando ask tampoco funciona. –

+0

preguntar? No, eso es 'awk'. – iconoclast

+0

Un buen punto acerca de la conversión a terminaciones de línea estilo UNIX; de lo contrario, las expresiones regulares pueden no funcionar como se esperaba. Nada aquí funcionó para mí hasta que convertí los finales de línea. –

12
grep -v "^[[:space:]]*$" 

The -v makes it print lines that do not completely match 

===Each part explained=== 
^    match start of line 
[[:space:]] match whitespace- spaces, tabs, carriage returns, etc. 
*    previous match (whitespace) may exist from 0 to infinite times 
$    match end of line 

Ejecución del código-

$ echo " 
> hello 
>  
> ok" | 
> grep -v "^[[:space:]]*$" 
hello 
ok 

Para entender más sobre cómo/por qué esto funciona, recomiendo leer sobre las expresiones regulares. http://www.regular-expressions.info/tutorial.html

+2

¿Cómo y por qué funciona esto? Su respuesta sería mucho mejor si pudiera explicarlo. Por ejemplo, su expresión regular coincide con el comienzo de la cadena y luego con uno o más espacios utilizando el estándar POSIX y luego el final de la cadena, es decir, grep -v elimina todas las líneas que son solo espacios. ¿Derecha? Qué pasa si no hay espacios; es simplemente un personaje de nueva línea? – Ben

+0

Como muestra mi ejemplo, incluso solo se elimina una línea vacía (la primera línea). Agregué más información, así que con suerte eso ayuda. :) – Sepero

0

grep pattern filename.txt | uniq

+0

'uniq' reducirá las líneas en blanco contiguas a solo una línea en blanco, pero no las eliminará por completo. Aún así, me gusta tratar de usar 'uniq' así. Ordenar primero eliminaría efectivamente todas las líneas en blanco, dejando solo una, pero reorganizar el orden de las líneas puede no ser aceptable. –

+0

Buen punto. Esto también matará líneas repetidas. Supongo que mi solución presenta errores. – baitisj

0
awk 'NF' file-with-blank-lines > file-with-no-blank-lines 
0

Utilizando Perl:

perl -ne 'print if /\S/' 

\S significa partidos personajes no están en blanco.

0

aquí hay otra manera de eliminar las líneas blancas y las líneas que comienzan con el signo #. Creo que esto es bastante útil para leer los archivos de configuración.

[[email protected] ~]# cat /etc/sudoers | egrep -v '^(#|$)' 
Defaults requiretty 
Defaults !visiblepw 
Defaults always_set_home 
Defaults env_reset 
Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR 
LS_COLORS" 
root ALL=(ALL)  ALL 
%wheel ALL=(ALL)  ALL 
stack ALL=(ALL) NOPASSWD: ALL 
1

Igual que las respuestas anteriores

grep -v -e '^$' foo.txt 

Aquí, -e grep significa versión extendida de grep. '^ $' significa que no hay caracteres entre^(Inicio de línea) y $ (fin de línea). '^' y '$' son caracteres regex.

Así que el comando grep -v imprimirá todas las líneas que no coinciden con este patrón (sin caracteres entre^y $).

De esta manera las líneas en blanco vacías se eliminan

23

Hazlo simple.

grep . filename.txt 
+0

esto me da todas las líneas del archivo –

+1

@ LưuVĩnhPhúc Debe mostrar todas las líneas del archivo, excepto las líneas en blanco. –

+0

Esto funciona para mí en archivos de un sistema basado en Linux pero no en archivos de Windows. Presumiblemente debido a los caracteres de final de línea de Windows. – ocertat

1

Si tiene secuencias de múltiples líneas en blanco en una fila, y quiere sólo una línea en blanco por secuencia, tratan

grep -v "unwantedThing" foo.txt | cat -s 

cat -s suprime repiten las líneas de salida vacías.

Su salida iría de

match1 



match2 

a

match1 

match2 

Las tres líneas en blanco en la salida original se comprimen o "exprimidos" en una línea en blanco.

0

egrep -v "^ \ s \ s +"

egrep ya lo hacen expresiones regulares, y el \ s es el espacio en blanco.

El + duplica el patrón actual.

El^es para el inicio

4

Se puede quitar espacio en blanco con este ejemplo:

grep . filename.txt 
Cuestiones relacionadas