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

Вопрос или проблема

Как удалить пустые/пустые (включая только пробелы) строки в файле в 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 — это инструмент для поиска и фильтрации текста по заданным паттернам. Для удаления пустых строк можно использовать несколько подходов:

  1. Исключение пустых строк:

    grep -v '^[:space:]*$' file.txt
    • Параметр -v используется для исключения строк, соответствующих шаблону.
  2. Исключение строк, непустых символами:

    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 системах возможность использования таких мощных инструментов делает задачу чистки данных быстро решаемой и гибкой. Выбор конкретного инструмента может зависеть от личных предпочтений, требований задачи и возможностей системы.

Оцените материал
Добавить комментарий

Капча загружается...