Eliminar líneas vacías en un archivo de texto a través de grep


Respuestas:


129

grep . FILE


(Y si realmente quiere hacerlo en sed, entonces: sed -e /^$/d FILE)

(Y si realmente quiere hacerlo en AWK, entonces: awk /./ FILE)


1
¡Dulce! TY para los otros comandos también, pero parece que grep es mi nuevo mejor amigo.
user191960

grep. ARCHIVO no funciona para mí. Probablemente sea mejor seguir con grep para buscar el contenido del archivo y sed para editar el contenido del archivo.
Michael Dillon

7
sed -ne/./ptambién funciona y awk /./es más corto (la acción es {print}si no se especifica). @ ghostdog74: grep '[^[:space:]]'entonces.
ephemient

5
Para aquellos que no entienden, .es una expresión regular que coincide con cualquier carácter excepto con la nueva línea.
wisbucky

3
grep . FILEfunciona con el ejemplo dado, pero no necesariamente cuando el archivo puede tener bytes que no forman parte del juego de caracteres. Por ejemplo, con GNU grep 2.20, printf "\x80\n" | grep .no genera nada.
vinc17

37

Intente lo siguiente:

grep -v -e '^$'

esto tiene el mismo efecto que grep. ARCHIVO en el que se tomará un espacio como una línea en blanco.
ghostdog74

1
"grep" busca cualquier línea que coincida con el patrón. "." coincide con cualquier personaje. "grep. FILE" coincide con cualquier línea con al menos 1 carácter. Mientras que "grep -v" excluye las líneas que coinciden con el patrón. OP dijo "eliminar todas las nuevas líneas vacías". Si desea excluir líneas con solo espacios, "grep -v '^ $'". El " " coincidirá con cero o más del patrón anterior, en este caso un espacio. Aunque es posible que también prefiera hacer coincidir y excluir otros caracteres de espacios en blanco (pestañas, feeds de formularios, etc.).
Mr.Ree

3
Este método me permitió combinar múltiples exclusiones más fácilmente que simplemente "grep. FILE". Por ejemplo, estaba mirando un archivo conf y quería excluir todas las líneas comentadas y todas las líneas vacías. Entonces usé "grep -v -e '#' -e '^ $' squid.conf". Funcionó de maravilla.
Ben K

2
este es mucho más rápido que el 'grep. ARCHIVO'. Esto se debe a las tareas más complejas de verificar la expresión regular '.' que excluir tan pronto como ^ $ no coincida.
Édouard Lopez

2
grep -v -e '^$'siempre funciona, que no es el caso de grep .. Por ejemplo, con GNU grep 2.20, printf "\x80\n" | grep .no genera nada, mientras que printf "\x80\n" | grep -v '^$'genera la línea no vacía.
vinc17

11
with awk, just check for number of fields. no need regex

$ more file
hello

world

foo

bar

$ awk 'NF' file
hello
world
foo
bar

No necesita cotizaciones. Este truco se encuentra en awk1line.txt- por otra parte, también lo son la mayoría de los trucos awk :)
ephemient

2
es solo mi buena práctica poner comillas, ya que lo está ejecutando desde el shell ... para declaraciones awk compuestas, todavía tiene que poner comillas. entonces, ¿por qué no cultivar este hábito?
ghostdog74

explicación de cómo funciona esto: stackoverflow.com/questions/23544804/…
wisbucky

9

Aquí hay una solución que elimina todas las líneas que están en blanco o contienen solo caracteres de espacio:

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

2

Prueba esto: sed -i '/^[ \t]*$/d' file-name

Eliminará todas las líneas en blanco que tengan un no. de espacios en blanco (espacios o tabulaciones) es decir (0 o más) en el archivo.

Nota: hay un 'espacio' seguido de '\ t' dentro del corchete.

El modificador -iobligará a volver a escribir el contenido actualizado en el archivo. Sin esta bandera, puede ver que las líneas vacías se eliminaron en la pantalla, pero el archivo real no se verá afectado.


1

grep '^..' my_file

ejemplo

THIS

IS

THE

FILE

EOF_MYFILE

da como salida solo líneas con al menos 2 caracteres.

THIS
IS
THE
FILE
EOF_MYFILE

Ver también los resultados con grep '^' my_filesalidas

THIS

IS

THE

FILE

EOF_MYFILE

y tambien con grep '^.' my_filesalidas

THIS
IS
THE
FILE
EOF_MYFILE

1

Si eliminar líneas vacías significa que las líneas incluyen espacios, use:

grep '\S' FILE

Por ejemplo:

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

line2

line3

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

line3

line4

Ver también:


0

Prueba 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

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

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

0

Perl puede ser excesivo, pero funciona igual de bien.

Elimina todas las líneas que están completamente en blanco:

perl -ne 'print if /./' file

Elimina todas las líneas que están completamente en blanco o solo contienen espacios en blanco:

perl -ne 'print if ! /^\s*$/' file

Variación que edita el original y crea un archivo .bak:

perl -i.bak -ne 'print if ! /^\s*$/' file

0

Si desea saber cuál es el total de líneas de código en su proyecto Xcode y no está interesado en enumerar el recuento de cada archivo rápido, esto le dará la respuesta. Elimina las líneas sin código y elimina las líneas que tienen el prefijo del comentario.//

Ejecútelo en el nivel raíz de su proyecto Xcode.

find . \( -iname \*.swift \) -exec grep -v '^[[:space:]]*$' \+ | grep -v -e '//' | wc -l

Si tiene bloques de comentarios en su código que comienzan /*y terminan con */tales como:

/*
 This is an comment block 
*/

entonces estos se incluirán en el recuento. (Demasiado duro).


0

Respuesta más simple -----------------------------------------

[root@node1 ~]# cat /etc/sudoers | grep -v -e ^# -e ^$
Defaults   !visiblepw
Defaults    always_set_home
Defaults    match_group_by_gid
Defaults    always_query_group_plugin
Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
root    ALL=(ALL)       ALL
%wheel  ALL=(ALL)       ALL
[root@node1 ~]#
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.