Назад | Перейти на главную страницу

Как удалить пустые / пустые строки из файла в Unix (включая пробелы)?

Как удалить пустые / пустые (включая только пробелы) строки в файле в Unix / Linux с помощью командной строки?

содержимое file.txt

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

желаемый результат

1:AAA
2:BBB
3:<space><space><space>CCC
4:DDD

Эта строка sed должна помочь:

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

В -i означает, что он будет редактировать файл на месте.

grep

Простое решение - использовать grep (GNU или BSD), как показано ниже.

  • Удалите пустые строки (кроме строк с пробелами).

    grep . file.txt
    
  • Удалите полностью пустые строки (включая строки с пробелами).

    grep "\S" file.txt
    

Примечание. Если вы получаете нежелательные цвета, это означает, что grep это псевдонимы grep --color=auto (проверьте type grep). В этом случае вы можете добавить --color=none параметр или просто запустите команду как \grep (который игнорирует псевдоним).


ripgrep

Похож на ripgrep (подходит для файлов гораздо большего размера).

Удалите пустые строки, исключая строки с пробелами:

rg -N . file.txt

или включая строки с пробелами:

rg -N "\S" file.txt

Смотрите также:

sed '/^$/d' file.txt

d - команда sed для удаления строки. ^$ - это регулярное выражение, соответствующее только пустой строке, за началом строки следует конец строки.

Вы можете использовать опцию -v с grep, чтобы удалить совпадающие пустые строки.

Как это

grep -Ev "^$" file.txt

Вот awk решение:

awk NF file.txt

С Awk, NF только для непустых строк. Когда это условие совпадает, действие Awk по умолчанию - распечатать всю строку.

Чтобы удалить пустые строки, вы можете сжать повторы новой строки с помощью tr:

cat file.txt | tr -s '\n' '\n'

Ex / Vim

Вот метод, использующий ex редактор (часть Vim):

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

Для нескольких файлов (редактирование на месте):

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

Обратите внимание :bufdo команда не POSIX.

Без изменения файла (просто распечатайте на стандартном выходе):

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

xargs, если вы не возражаете удалить ведущие пробелы

$ 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

Для меня команда @ martigin-heemels выдавала ошибку, которая исправила ее (т.е. фиктивный параметр для i),

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