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


Ответы:


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будет печатать всю строку.


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

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

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


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

3

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

| xargs -L1


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


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

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

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