¿Cómo eliminar líneas en blanco de un archivo (incluyendo tabulación y espacios)?

Respuestas:

26

Solo greppara no espacios en blanco:

grep '[^[:blank:]]' < file.in > file.out

[:blank:], dentro de los rangos de caracteres ( [...]), se llama una clase de caracteres POSIX. Hay algunos como [:alpha:], [:digit:]... [:blank:]coincide con el espacio en blanco horizontal (en la configuración regional POSIX, eso es espacio y pestaña, pero en otras configuraciones regionales podría haber más, como todos los caracteres de espaciado horizontal Unicode en configuraciones regionales UTF8) mientras [[:space:]]coincide con el blanco horizontal y vertical caracteres de espacio (igual que [:blank:]más cosas como tabulación vertical, avance de formulario ...).

grep '[:blank:]'

Volvería las líneas que contienen cualquiera de los caracteres, :, b, l, a, no k. Las clases de caracteres solo se reconocen dentro [...]y ^dentro [...]del conjunto. Entonces [^[:blank:]]significa cualquier personaje menos los en blanco.

Stéphane Chazelas
fuente
1
¿debería haber también un $fin de línea?
Michael Durrant
@MichaelDurrant No está anclado en ninguno de los lados
jordanm
1
@MichaelDurrant. [^[:blank:]]$solo coincidiría con las líneas que terminan en un espacio en blanco. Queremos líneas que contengan un espacio en blanco en cualquier lugar
Stéphane Chazelas
@StephaneChazelas Intenté grep [: blank:] SOURCEFILE incluso este comando está funcionando. Entiendo que [] es para la clase de personaje, ¿podría darme una idea de cómo funciona? el fragmento: en blanco: es nuevo para mí.
Jamshed Ansari user3000272
¿Hay casos en los grep -E '\S'que no funcionaría?
terdon
21

Aquí hay una awksolución:

$ awk NF file

Con awk, NFsolo se establece en líneas no en blanco. Cuando esta condición coincide, la awkacción predeterminada que printse imprimirá toda la línea.

Cuonglm
fuente
Aseado, esto también elimina líneas con espacios en blanco.
wisbucky
7

Qué tal si:

sed -e 's/^[[:blank:]]*$//' source_file > newfile

o

sed -e '/^[[:blank:]]*$/d' source_file > newfile

es decir

Para cada línea, sustituya:

  • si comienza (" ^")
  • con espacios o tabulaciones (" [[:blank:]]") cero o más veces (" *")
  • y luego es el final de la línea (" $")

Más información sobre :: blank :: y otros caracteres especiales en http://www.zytrax.com/tech/web/regex.htm#special

Michael Durrant
fuente
44
[[:space:]]Incluye pestañas. Si no fuera así, su expresión regular fallaría si un espacio siguiera a una pestaña.
jordanm
Las páginas de manual wctype(3)y isalpha(3)describen con qué coincidirán las clases de caracteres.
jordanm
Es posible que desee eliminar el primero que no responde la pregunta.
Stéphane Chazelas
@MichaelDurrant, ¿puedes escribir algo sobre [[: blank:]]?
Jamshed Ansari user3000272
Se agregó información para [[: blank ::]]. Stephane, ¿por qué no funciona el primer trabajo? Pensé que // al final reemplazaría la línea sin nada.
Michael Durrant
4

Puede usar el sedcomando para eliminar líneas en blanco:

sed '/^$/d' in > out

Este comando elimina todas las líneas vacías del archivo "en"

Raghavendra
fuente
Eso no elimina las líneas que contienen solo espacio y tabulación, como se solicitó específicamente.
dave_thompson_085
3

Parece que encontré uno no tan rápido, pero divertido al fin:

| xargs -L1

poige
fuente
1
Bonito y corto, pero hace más: eliminar los espacios iniciales y las pestañas también.
jringoot
Oh, ¿se descubrió que es aún más capaz? - ¡Agradable! ;-P
poige
1
Y trunca las líneas (predeterminado en 1024 caracteres) Ver páginas de manual: linux.die.net/man/1/xargs
jringoot
¡Me estoy enamorando más de esa herramienta simple! 11)
poige
0

Intenta ex -way:

ex -s +'v/\S/d' -cwq test.txt

Para varios archivos (editar en el lugar):

ex -s +'bufdo!v/\S/d' -cxa *.txt

Nota: El :bufdocomando no es POSIX .

Sin modificar el archivo (solo imprima en la salida estándar):

cat test.txt | ex -s +'v/\S/d' +%p +q! /dev/stdin
kenorb
fuente
0

Use el siguiente comando:

grep '\S' FILE

que elimina todas las líneas, incluidos los espacios o las pestañas.

De lo contrario, la eliminación no incluye líneas con espacios / tabulaciones, use:

grep . FILE

Por ejemplo:

$  printf "line1\n\nline2\n \nline3\n" > FILE
$  cat -v FILE
line1

line2

line3
$  grep '\S' FILE
line1
line2
line3
$  grep . FILE
line1
line2

line3

Ver también:

kenorb
fuente