Удаление пустых строк с помощью sed

Я пытаюсь удалить пустые строки с помощью sed:

sed '/^$/d'

но мне не повезло с этим.

например, у меня есть такие строки:

xxxxxx


yyyyyy


zzzzzz

и я хочу, чтобы это было так:

xxxxxx
yyyyyy
zzzzzz

каким должен быть код для этого?

12 ответов


у вас может быть пробел/вкладки в вашей "пустой" строке. Если да, то это поможет:

sed '/^\s*$/d'

использует \s для соответствия любому символу пробела.


sed '/^$/d' должно быть хорошо, вы ожидаете, чтобы изменить файл на месте? Если это так, вы должны использовать -i флаг.

возможно, эти строки не пусты, поэтому, если это так, посмотрите на этот вопрос удалите пустые строки из txtfiles, удалите пробелы из начала и конца строки Я считаю, что это то, чего вы пытаетесь достичь.


и awk устранение:

awk 'NF' file

который вернется:

xxxxxx
yyyyyy
zzzzzz

как это работает? С NF означает "количество полей", эти пустые строки имеют 0 fiedls, так что awk оценивает 0 в False и строка не печатается; однако, если есть хотя бы одно поле, оценка истинна и делает awk выполнит действие по умолчанию: печать текущей строки.


Я считаю, что это самый простой и быстрый:

cat file.txt | grep .

Если вам нужно игнорировать все линии пробела, а затем попробуйте это:

cat file.txt | grep '\S'

пример:

s="\
\
a\
 b\
\
Below is TAB:\
    \
Below is space:\
 \
c\
\
"; echo "$s" | grep . | wc -l; echo "$s" | grep '\S' | wc -l

выходы

7
5

С помощью принятого ответа здесь и принятый ответ выше, я использовал:

$ sed 's/^ *//; s/ *$//; /^$/d; /^\s*$/d' file.txt > output.txt

`s/^ *//`  => left trim
`s/ *$//`  => right trim
`/^$/d`    => remove empty line
`/^\s*$/d` => delete lines which may contain white space

Это покрывает все основания и отлично работает для моих нужд. Престижность оригинальных постеров @Kent и @kev


вы можете сказать:

sed -n '/ / p' filename    #there is a space between '//'

вы можете сделать что-то подобное, используя "grep", тоже:

egrep -v "^$" file.txt

это работает и в awk.

awk '!/^$/' file
xxxxxx
yyyyyy
zzzzzz

вы, скорее всего, видите неожиданное поведение, потому что ваш текстовый файл был создан в Windows, поэтому конец последовательности строк \r\n. Вы можете использовать dos2unix для преобразования его в текстовый файл стиля UNIX перед запуском sed или использовать

sed -r "/^\r?$/d"

чтобы удалить пустые строки, независимо от того, есть ли возврат каретки.


мой bash - конкретный ответ-рекомендовать использовать perl оператор подстановки с глобальным шаблоном g флаг для этого, как показано ниже:

$ perl -pe s'/^\n|^[\ ]*\n//g' $file
xxxxxx
yyyyyy
zzzzzz

этот ответ иллюстрирует учет того, имеют ли пустые строки пробелы в них ([\ ]*), а также используя | для разделения нескольких поисковых терминов / полей. Протестировано на macOS High Sierra и CentOS 6/7.

FYI, исходный код OP sed '/^$/d' $file работает в bash терминал на macOS High Sierra и CentOS 6/7 Linux в высокопроизводительном суперкомпьютерном кластере.


для меня с FreeBSD 10.1 с sed работало только это решение:

sed -e '/^[     ]*$/d' "testfile"

внутри [] есть символы пробелов и вкладок.

тестовый файл содержит:

fffffff next 1 tabline ffffffffffff

ffffffff next 1 Space line ffffffffffff

ffffffff empty 1 lines ffffffffffff

============ EOF =============