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

23

Я хочу удалить все пустые строки из файла. Даже если строка содержит пробелы или символы табуляции, ее также следует удалить.

Джамшед Ансари user3000272
источник

Ответы:

26

Просто grepдля незаполненных:

grep '[^[:blank:]]' < file.in > file.out

[:blank:]внутри символьного диапазона ( [...]) называется классом символов POSIX. Есть несколько таких [:alpha:], как [:digit:]... [:blank:]соответствует горизонтальному пробелу (в локали POSIX это пробел и табуляция, но в других локалях их может быть больше, как все символы Unicode с горизонтальным интервалом в локалях UTF8), в то время как [[:space:]]совпадает с горизонтальным и вертикальным белым пробелы (такие же, как [:blank:]плюсы, такие как вертикальная табуляция, подача формы ...).

grep '[:blank:]'

Вернуть бы те строки , которые содержат любой из символов, :, b, l, a, nили k. Классы символов распознаются только внутри [...], а ^внутри - [...]отрицает множество. Так [^[:blank:]]означает любой символ, кроме пустых.

Стефан Шазелас
источник
1
также должен быть $конец строки?
Майкл Даррант
@MichaelDurrant Это не закреплено с обеих сторон
Джорданм
1
@MichaelDurrant. [^[:blank:]]$будет соответствовать только строки, которые заканчиваются непустым. Мы хотим, чтобы в любом месте
Стефан Шазелас
@StephaneChazelas Я попробовал grep [: blank:] SOURCEFILE, даже если эта команда работает. Я понимаю, что [] для класса персонажей, не могли бы вы дать мне некоторое представление о том, как это работает? фрагмент: blank: для меня новинка.
Джамшед Ансари user3000272
Есть ли случаи, когда grep -E '\S'не работал?
Тердон
21

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

$ awk NF file

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

cuonglm
источник
Аккуратно, это также удаляет строки с пробелами.
Висбуки
7

Как насчет:

sed -e 's/^[[:blank:]]*$//' source_file > newfile

или

sed -e '/^[[:blank:]]*$/d' source_file > newfile

т.е.

Для каждой строки подставьте:

  • если это начинается (" ^")
  • с пробелами или табуляцией (" [[:blank:]]") ноль или более раз (" *")
  • а затем конец строки (" $")

Дополнительная информация о :: blank :: и других специальных символах на http://www.zytrax.com/tech/web/regex.htm#special

Майкл Даррант
источник
4
[[:space:]]включает в себя вкладки. Если это не так, ваше регулярное выражение не будет выполнено, если после табуляции будет пробел.
Иордания
wctype(3)И isalpha(3)страница руководства описывают то , что классы символов будут совпадать.
Иордания
Вы можете удалить первый, который не отвечает на вопрос.
Стефан Шазелас
@MichaelDurrant не могли бы вы написать что-нибудь о [[: blank:]]?
Джамшед Ансари user3000272
Добавлена ​​информация для [[: blank ::]]. Стефан, почему не работает первый? Я думал // в конце заменит строку без ничего.
Майкл Даррант
4

Вы можете использовать sedкоманду для удаления пустых строк:

sed '/^$/d' in > out

Эта команда удаляет все пустые строки из файла «в»

Raghavendra
источник
Это не удаляет строки, содержащие только пробел и табуляцию, как было запрошено.
dave_thompson_085
3

Похоже, я нашел не так быстро, но наконец-то смешно:

| xargs -L1

poige
источник
1
Хороший короткий, но он делает больше: удаляет также пробелы и пробелы.
jringoot
О, это оказалось еще более способным? - Ницца! ;-P
Пой
1
И он усекает строки (по умолчанию в 1024 символа). См. Страницы man: linux.die.net/man/1/xargs
jringoot
Я все глубже
poige
0

Попробуйте ex -way:

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
источник
примечание: bufdo - это не POSIX. pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html
Стивен Пенни,
0

Используйте следующую команду:

grep '\S' FILE

который удаляет все строки, включая пробелы или символы табуляции.

В противном случае для удаления, не включая строки с пробелами / табуляциями, используйте:

grep . FILE

Например:

$  printf "line1\n\nline2\n \nline3\n" > FILE
$  cat -v FILE
line1

line2

line3
$  grep '\S' FILE
line1
line2
line3
$  grep . FILE
line1
line2

line3

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

kenorb
источник