¿Cómo eliminar líneas vacías / en blanco de un archivo en Unix (incluidos los espacios)?

61

¿Cómo elimino líneas vacías / en blanco (incluidos solo espacios) en un archivo en Unix / Linux usando la línea de comando?

contenido del archivo.txt

Line:Text
1:<blank>
2:AAA
3:<blank>
4:BBB
5:<blank>
6:<space><space><space>CCC
7:<space><space>
8:DDD

salida deseada

1:AAA
2:BBB
3:<space><space><space>CCC
4:DDD
Michael Ellick Ang
fuente
1
Esta es una respuesta épica que ofrece casi todas las soluciones posibles usando grep, sed, awk: stackoverflow.com/questions/16414410/…
wisbucky

Respuestas:

87

Esta línea sed debería hacer el truco:

sed -i '/^$/d' file.txt

Esto -isignifica que editará el archivo en el lugar.

Martijn Heemels
fuente
13
En realidad, debe ser "/ ^ * $ / d" para eliminar líneas que solo contienen espacios.
Sean Reifschneider
2
@SeanReifschneider ¿Ese requisito no estaba en la pregunta cuando se escribió esta respuesta?
kasperd
44
@SeanReifschneider ¿"/ ^ \ s * $ / d" no sería mejor ya que incluiría pestañas? Si bien no se menciona en la publicación original, me parece una opción más fuerte.
mrswadge
Obtengobad flag in substitute command: 'e'
ishandutta2007
31

grep

La solución simple es usar el comando grep( GNU o BSD ) como se muestra a continuación.

  • Eliminar líneas en blanco (sin incluir líneas con espacios).

    grep . file.txt
    
  • Elimine las líneas completamente en blanco (incluidas las líneas con espacios).

    grep "\S" file.txt
    

Nota: Si obtiene colores no deseados, eso significa que sus grepalias son grep --color=auto(consulte type grep). En ese caso, puede agregar --color=noneparámetros o simplemente ejecutar el comando como \grep(que ignora el alias).


ripgrep

Similar con ripgrep(adecuado para archivos mucho más grandes).

Elimine líneas en blanco sin incluir líneas con espacios:

rg -N . file.txt

o incluyendo líneas con espacios:

rg -N "\S" file.txt

Ver también:

kenorb
fuente
2
grep .Parece ser la solución más simple.
Leo
La desventaja de grep .las otras soluciones es que resaltará todo el texto en rojo. Las otras soluciones pueden preservar los colores originales. Compare unbuffer apt search foo | grep .conunbuffer apt search foo | grep -v ^$
wisbucky
1
@wisbucky Ve colores, porque greptiene un alias grep --color=autoen su sistema (verifique por :) type grep. Puede ejecutarlo \grepo usar el --color=noneparámetro.
kenorb
@kenorb Si utiliza grep --color=none ., obtendrá todo el texto blanco, lo que anula el formato de color de la orden original (ejemplo: apt search foo)
wisbucky
grep .coincidirá con las líneas que contienen solo espacios, lo que el OP dice que no se desea.
Jim L.
27
sed '/^$/d' file.txt

d es el comando sed para eliminar una línea. ^$es una expresión regular que coincide solo con una línea en blanco, un inicio de línea seguido de un final de línea.

Kamil Kisiel
fuente
+1 para la explicación
Alex Raj Kaliamoorthy
Este comando no produce la misma salida que OP solicitada (produce 5 líneas, no 4).
kenorb
22

Puede usar la opción -v con grep para eliminar las líneas vacías coincidentes.

Me gusta esto

grep -Ev "^$" file.txt
jdabney
fuente
44
No creo que necesites -E, al menos no con GNU grep, pero aparte de eso, ¡estoy muy contento de ver que esto se haga con grep! Es lo que busco en lugar de sed, siempre; Los filtros en línea me parecen mejores que los editores en línea.
MadHatter
Si desea omitir las líneas comentadas y en blanco, especialmente al tratar con el uso de archivos confgrep -Ev '^#|^$' file.txt
Govind Kailas
7

Aquí hay una awksolución:

awk NF file.txt

Con Awk, NFsolo se establece en líneas no en blanco. Cuando esta condición coincide, la acción predeterminada de Awk es imprimir toda la línea.

Steven Penny
fuente
6

Para eliminar líneas vacías, puede exprimir nuevas repeticiones de línea con tr:

cat file.txt | tr -s '\n' '\n'
siddhadev
fuente
Esto produce 6 líneas, no 4 según lo solicitado por OP.
kenorb
1

xargs si no te importa eliminar espacios en blanco

$ docker run -it --rm alpine sh
/ # cat <<eof > /tmp/file
> one
>
>   two
> three
>
>
>   four
> eof
/ # cat /tmp/file
one

  two
three


  four
/ # cat /tmp/file | xargs -n1
one
two
three
four
Christian Calloway
fuente
0

Ex / Vim

Aquí está el método que usa el exeditor (parte de Vim):

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

Para mí, el comando @ martigin-heemels arrojó un error, esto lo solucionó (es decir, un parámetro ficticio para i),

sed -i '' '/^$/d' file.txt

ishandutta2007
fuente
0

Probablemente la forma más fácil de eliminar líneas en blanco (sin espacios) es usar cat -s:

$ cat -s file
$ some-command | cat -s

Al menos si no desea editar un archivo en el lugar pero, por ejemplo, escriba en el terminal. Además, no involucra ningún negocio divertido de expresiones regulares, por lo que es muy fácil de recordar incluso para personas que no son amigables con RE.


De man cat:

-s, --squeeze-blank never more than one single blank line

Puede ser diferente en diferentes sistemas operativos, pero estuve presente en algunos Linux y OpenBSD la última vez que lo revisé.

kyrill
fuente