Eliminar líneas vacías usando sed

Estoy tratando de eliminar líneas vacías usando sed:

sed '/^$/d' 

pero no tengo suerte con eso.

Por ejemplo, tengo estas líneas:

 xxxxxx yyyyyy zzzzzz 

y quiero que sea así:

 xxxxxx yyyyyy zzzzzz 

¿Cuál debería ser el código para esto?

Puede tener espacio / tabs en su línea “vacía”. Si es así, esto ayudará:

 sed '/^\s*$/d' 

Utiliza \s para hacer coincidir cualquier carácter de espacio en blanco.

sed '/^$/d' debería estar bien, ¿esperas modificar el archivo en su lugar? Si es así, debes usar la bandera -i .

Quizás esas líneas no estén vacías, así que si ese es el caso, mira esta pregunta. Elimina las líneas vacías de los archivos txt, elimina los espacios del inicio y el final de la línea . Creo que eso es lo que intentas lograr.

Me falta la solución awk :

 awk 'NF' file 

Cuál volvería:

 xxxxxx yyyyyy zzzzzz 

¿Como funciona esto? Como NF significa “número de campos”, esas líneas que están vacías tienen 0 fiedls, por lo que awk evalúa 0 como False y no se imprime ninguna línea; sin embargo, si hay al menos un campo, la evaluación es Verdadero y hace que awk realice su acción predeterminada: imprima la línea actual.

Creo que este es el más fácil y rápido:

 cat file.txt | grep . 

Si necesita ignorar todas las líneas de espacio en blanco también intente esto:

 cat file.txt | grep '\S' 

Ejemplo:

 s="\ \ a\ b\ \ Below is TAB:\ \ Below is space:\ \ c\ \ "; echo "$s" | grep . | wc -l; echo "$s" | grep '\S' | wc -l 

salidas

 7 5 

sed

  • '/^\[\[:space:\]\]*$/d'
  • '/^\s*$/d'
  • '/^$/d'
  • -n '/^\s*$/!p'

grep

  • .
  • -v '^$'
  • -v '^\s*$'
  • -v '^\[\[:space:\]\]*$'

awk

  • /./
  • 'NF'
  • 'length'
  • '/^[ \t]*$/ {next;} {print}'
  • '!/^\[ \t\]*$/'

Con la ayuda de la respuesta aceptada aquí y la respuesta aceptada anteriormente, he utilizado:

 $ sed 's/^ *//; s/ *$//; /^$/d; /^\s*$/d' file.txt > output.txt `s/^ *//` => left trim `s/ *$//` => right trim `/^$/d` => remove empty line `/^\s*$/d` => delete lines which may contain white space 

Esto cubre todas las bases y funciona perfectamente para mis necesidades. Felicitaciones a los carteles originales @Kent y @kev

Puedes decir:

 sed -n '/ / p' filename #there is a space between '//' 

También puedes hacer algo como eso usando “grep”:

 egrep -v "^$" file.txt 

Esto también funciona en awk.

 awk '!/^$/' file xxxxxx yyyyyy zzzzzz 

Lo más probable es que vea el comportamiento inesperado porque el archivo de texto se creó en Windows, por lo que la secuencia de fin de línea es \r\n . Puede usar dos2unix para convertirlo a un archivo de texto de estilo UNIX antes de ejecutar sed o usar

 sed -r "/^\r?$/d" 

para eliminar líneas en blanco ya sea que el retorno de carro esté o no allí.

Mi respuesta bash específica es recomendar usar el operador de sustitución de perl con el indicador global de patrón g para esto, de la siguiente manera:

 $ perl -pe s'/^\n|^[\ ]*\n//g' $file xxxxxx yyyyyy zzzzzz 

Esta respuesta ilustra la contabilidad de si las líneas vacías tienen espacios en ellas ( [\ ]* ), así como el uso | para separar múltiples términos / campos de búsqueda. Probado en macOS High Sierra y CentOS 6/7.

Para su información, el sed '/^$/d' $file original de OP sed '/^$/d' $file funciona bien en bash Terminal en macOS High Sierra y CentOS 6/7 Linux en un clúster de supercomputación de alto rendimiento.

Para mí, con FreeBSD 10.1 con sed solo funcionó esta solución:

 sed -e '/^[ ]*$/d' "testfile" 

dentro de [] hay símbolos de espacio y tabulación.

archivo de prueba contiene:

 fffffff next 1 tabline ffffffffffff ffffffff next 1 Space line ffffffffffff ffffffff empty 1 lines ffffffffffff ============ EOF =============