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



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



sed '/^$/d'


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



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



xxxxxx


yyyyyy


zzzzzz


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



xxxxxx
yyyyyy
zzzzzz


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

925   12  

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 =============

Comments

    Ничего не найдено.