Вопрос или проблема
Как удалить пустые/пустые (включая только пробелы) строки в файле в Unix/Linux с помощью командной строки?
Содержимое file.txt
Line:Text
1:<пусто>
2:AAA
3:<пусто>
4:BBB
5:<пусто>
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'
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
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
Для меня команда @martigin-heemels выдавала ошибку, это исправило её (т.е. фиктивный параметр для i),
sed -i '' '/^$/d' file.txt
Самое простое решение, которое я нашел:
cat file.txt | strings
Ответ или решение
Для удаления пустых строк (включая строки, содержащие только пробелы) в файле на Unix/Linux существует множество инструментов и методов командной строки. Рассмотрим каждый из этих методов и их применения с точки зрения эффективности и простоты использования.
Теория
При работе с текстовыми файлами часто возникает необходимость в их очистке от пустых строк. Пустыми считаются строки, в которых нет символов или которые содержат только пробелы или другие пустые символы (например, табуляцию). Удаление таких строк необходимо для того, чтобы данные выглядели чище и легче поддавались анализу.
Примеры и реализация
Использование команды sed
sed (stream editor) — это мощный инструмент для потоковой обработки текстов. Для удаления пустых строк в файле используется следующая команда:
sed -i '/^[[:space:]]*$/d' file.txt
- Опция
-i
позволяет редактировать файл на месте. - Выражение
/^[[:space:]]*$/d
ищет строки, которые состоят только из пробелов или пустые, и удаляет их.
Использование команды grep
grep — это инструмент для поиска и фильтрации текста по заданным паттернам. Для удаления пустых строк можно использовать несколько подходов:
-
Исключение пустых строк:
grep -v '^[:space:]*$' file.txt
- Параметр
-v
используется для исключения строк, соответствующих шаблону.
- Параметр
-
Исключение строк, непустых символами:
grep '\S' file.txt
- Шаблон
\S
ищет строки, содержащие хоть один символ, отличный от пробела.
- Шаблон
Использование команды awk
awk — это скриптовый язык для обработки и текстового анализа данных. Он также может быть использован для удаления пустых строк:
awk 'NF' file.txt
Здесь NF
(Number of Fields) — это переменная, обозначающая число полей в строке. Если строка непустая, то она будет выведена на экран.
Использование других инструментов
-
tr: команда
tr
может использоваться для удаления повторяющихся новых строк, хотя это не самый эффективный способ:tr -s '\n' < file.txt
-
ex/vim: текстовый редактор vim может выполнять команды на уровне командной строки:
ex -s +'v/\S/d' -cwq file.txt
-
xargs: этот инструмент может понадобиться, если вы не против удаления ведущих пробелов:
xargs -n1 < file.txt
Бонусный метод: strings
Это один из самых простых способов удаления всех пустых строк, хотя он может вести себя непредсказуемо:
cat file.txt | strings
Применение
При выборе метода удаления пустых строк обратите внимание на специфику ваших данных и конечную цель. Если файлы очень большие, выгоднее использовать более оптимизированные инструменты, такие как sed или grep. Если важна читаемость или интеграция с другими текстовыми обработчиками, выбирайте awk или vim.
Удаление пустых строк не только улучшает читаемость данных, но и облегчает последующую автоматизированную обработку с помощью скриптов или программ. В Unix/Linux системах возможность использования таких мощных инструментов делает задачу чистки данных быстро решаемой и гибкой. Выбор конкретного инструмента может зависеть от личных предпочтений, требований задачи и возможностей системы.