Как удалить пустые / пустые (включая только пробелы) строки в файле в 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
: Удалите пустые строки с помощью sedawk
: Удалите пустые строки с помощью awksed '/^$/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 -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