HOWTO · Bash

Eliminar líneas vacías en Bash

Este tutorial explica cómo filtrar líneas vacías en Bash.

En esta página

Cuando un archivo de texto contiene líneas vacías no deseadas, puede filtrarlas mientras lo muestra con sed, grep o awk. Cada comando que aparece a continuación escribe las líneas conservadas en la salida estándar y deja intacto el archivo de origen. Estas son utilidades de línea de comandos que se usan desde Bash u otro shell similar a POSIX, no palabras clave ni elementos integrados de Bash.

Elija sed para una operación de edición de flujo, grep para una coincidencia inversa compacta o awk cuando el filtro vaya a formar parte de un script más amplio de procesamiento de registros. Para guardar el resultado, redirija la salida del comando a un archivo independiente y revíselo antes de reemplazar el origen. Estas utilidades suelen estar disponibles en Bash/Linux y en otros entornos de línea de comandos similares a POSIX.

Preparar el archivo de entrada de Bash

Para los ejemplos de comandos, suponga que 1_Test.txt contiene cuatro líneas de texto, con una línea vacía entre la segunda y la tercera. El script completo que aparece a continuación crea ese archivo en una ruta temporal, aplica el filtro y muestra el resultado. Después del comando, elimina sus archivos temporales. El bloque de salida muestra las cuatro líneas conservadas.

temp_dir="$(mktemp -d)"
sample_file="$temp_dir/1_Test.txt"
printf '%s\n' \
  'This is the first line.' \
  'This is the second line.' \
  '' \
  'This is the third line.' \
  'This is the fourth line.' > "$sample_file"
sed '/^[[:space:]]*$/d' "$sample_file"
rm -f "$sample_file"
rmdir "$temp_dir"
This is the first line.
This is the second line.
This is the third line.
This is the fourth line.

Esto elimina las líneas vacías del resultado mostrado y conserva las cuatro líneas no vacías.

La expresión ^[[:space:]]*$ coincide con una línea desde el principio hasta el final cuando contiene únicamente espacios en blanco. Por tanto, los mismos comandos funcionan tanto con líneas sin caracteres como con líneas que contienen espacios o tabulaciones.

Filtrar líneas con la utilidad sed

sed interpreta /^[[:space:]]*$/d como una regla de eliminación. Cuando el patrón coincide, d elimina esa línea de entrada del flujo que se envía a la salida estándar. Para el archivo de ejemplo, ejecute sed '/^[[:space:]]*$/d' 1_Test.txt.

Este comando deja intacto el archivo original. Si necesita un archivo nuevo y limpio, redirija la salida a una ruta independiente, por ejemplo sed '/^[[:space:]]*$/d' 1_Test.txt > cleaned.txt, y revíselo antes de reemplazar el origen. La redirección es la que guarda el flujo filtrado; sed sigue leyendo la ruta original.

Filtrar líneas con la utilidad grep

grep -v invierte la coincidencia, por lo que muestra las líneas que no coinciden con ^[[:space:]]*$. Para 1_Test.txt, ejecute grep -v '^[[:space:]]*$' 1_Test.txt. La expresión regular es la misma que en el comando sed, mientras que -v indica a grep que conserve las líneas que no coinciden.

Al igual que la versión con sed, grep envía las líneas conservadas a la salida estándar y no modifica la ruta de entrada. Es una opción práctica cuando la tarea consiste simplemente en excluir las líneas que coinciden con un patrón. Redirija su salida a otro archivo cuando necesite guardar el resultado.

Este ejemplo autónomo crea el archivo de muestra antes de aplicar el filtro de grep, por lo que puede adaptarlo sin depender de un archivo complementario existente:

temp_dir="$(mktemp -d)"
sample_file="$temp_dir/1_Test.txt"
printf '%s\n' \
  'This is the first line.' \
  'This is the second line.' \
  '' \
  'This is the third line.' \
  'This is the fourth line.' > "$sample_file"
grep -v '^[[:space:]]*$' "$sample_file"
rm -f "$sample_file"
rmdir "$temp_dir"

Filtrar líneas con la utilidad awk

awk muestra un registro cuando su condición es verdadera. El patrón negado ! /^[[:space:]]*$ es verdadero para todas las líneas que contienen algo más que espacios en blanco, por lo que awk '!/^[[:space:]]*$/' 1_Test.txt conserva las líneas significativas de 1_Test.txt.

Esta forma resulta útil cuando el filtro de líneas va a formar parte de un script más amplio de procesamiento de registros. Al igual que los otros comandos, escribe únicamente los registros conservados en la salida estándar y no reemplaza 1_Test.txt. Redirija el resultado o use un flujo de trabajo independiente de edición de archivos cuando necesite guardar una copia.

El siguiente ejemplo independiente usa la misma estructura de entrada con awk y deja disponible la ruta de origen para comandos posteriores:

temp_dir="$(mktemp -d)"
sample_file="$temp_dir/1_Test.txt"
printf '%s\n' \
  'This is the first line.' \
  'This is the second line.' \
  '' \
  'This is the third line.' \
  'This is the fourth line.' > "$sample_file"
awk '!/^[[:space:]]*$/' "$sample_file"
rm -f "$sample_file"
rmdir "$temp_dir"