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

61

Как удалить пустые / пустые (включая только пробелы) строки в файле в 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
Майкл Эллик Анг
источник
1
Это эпический ответ, который дает практически все возможные решения с использованием grep, sed, awk: stackoverflow.com/questions/16414410/…
wisbucky

Ответы:

87

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

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

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

Мартейн Хеемельс
источник
13
На самом деле это должен быть "/ ^ * $ / d", чтобы удалить строки, которые содержат только пробелы.
Шон Рейфшнайдер
2
@SeanReifschneider Это требование не было в вопросе, когда этот ответ был написан?
kasperd
4
@SeanReifschneider Не будет ли "/ ^ \ s * $ / d" лучше, так как он будет содержать вкладки? Хотя это не упоминается в оригинальном посте, мне кажется, что это более сильный вариант.
mrswadge
Я получаюbad flag in substitute command: 'e'
ishandutta2007
31

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

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

kenorb
источник
2
grep .кажется самым простым решением.
Лев
Недостатком по grep .сравнению с другими решениями является то, что он выделит весь текст красным цветом. Другие решения могут сохранить оригинальные цвета. Сравните unbuffer apt search foo | grep .сunbuffer apt search foo | grep -v ^$
wisbucky
1
@wisbucky Вы видите цвета, потому что grepв grep --color=autoвашей системе есть псевдоним (проверьте :) type grep. Вы можете запустить его как \grepили использовать --color=noneпараметр.
Кенорб
@kenorb Если вы используете grep --color=none ., вы получите все белый текст, который переопределяет цветое форматирование оригинальной команды (пример: apt search foo)
wisbucky
grep .будут совпадать со строками, содержащими только пробелы, которые, как говорит OP, нежелательны.
Джим Л.
27
sed '/^$/d' file.txt

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

Камил Кисиэль
источник
+1 за объяснение
Алекс Радж Калиамурти
Эта команда не выдает тот же результат, что запрошенный OP (она выдает 5 строк, а не 4).
Кенорб
22

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

Нравится

grep -Ev "^$" file.txt
jdabney
источник
4
Я не верю, что вам нужно -E, по крайней мере, с GNU grep, но кроме этого я так рад видеть, что это сделано с grep! Это то, чего я достигаю, предпочитая sed каждый раз; встроенные фильтры кажутся мне лучше, чем встроенные редакторы.
MadHatter
Если вы хотите пропустить закомментированные и пустые строки, особенно при работе с файлами conf, используйтеgrep -Ev '^#|^$' file.txt
Говинд Кайлас
7

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

awk NF file.txt

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

Стивен Пенни
источник
6

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

cat file.txt | tr -s '\n' '\n'
siddhadev
источник
В результате получается 6 строк, а не 4, как запрашивается OP.
Кенорб
1

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
Кристиан Кэллоуэй
источник
0

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
kenorb
источник
0

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

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

ishandutta2007
источник
0

Вероятно, самый простой способ удалить пустые строки (без пробелов) - это использовать cat -s:

$ cat -s file
$ some-command | cat -s

По крайней мере, если вы не хотите редактировать файл на месте, а, например, вместо этого писать в терминал. Кроме того, это не связано с каким-либо забавным бизнесом регулярных выражений, поэтому его очень легко запомнить даже для не-дружелюбных людей.


От man cat:

-s, --squeeze-blank never more than one single blank line

Может отличаться в разных ОС, но присутствовал в нескольких Linux и OpenBSD в прошлый раз, когда я проверял.

Кирилл
источник