Как удалить пустые / пустые строки из файла в 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

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


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

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'

В результате получается 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

0

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

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


0

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

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

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


От man cat:

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.