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

Я пытаюсь удалить пустые строки, используя sed:

sed '/^$/d'

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

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

xxxxxx


yyyyyy


zzzzzz

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

xxxxxx
yyyyyy
zzzzzz

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

Ответ 1

В вашей "пустой" строке могут быть пробелы или символы табуляции. Используйте классы POSIX с sed чтобы удалить все строки, содержащие только пробелы:

sed '/^[[:space:]]*$/d'

Более короткая версия, которая использует ERE, например, с gnu sed:

sed -r '/^\s*$/d'

(Обратите внимание, что sed НЕ поддерживает PCRE.)

Ответ 2

Мне не хватает решения awk:

awk 'NF' file

Что будет возвращено:

xxxxxx
yyyyyy
zzzzzz

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

Ответ 3

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

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

Ответ 5

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

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

Ответ 6

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

$ 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

Ответ 7

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

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

Ответ 8

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

egrep -v "^$" file.txt

Ответ 9

Это также работает в awk.

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

Ответ 10

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

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

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

Ответ 11

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

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

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

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

Ответ 12

Еще более простой метод с использованием awk.

Ответ: cat filename.txt | awk 'NF' cat filename.txt | awk 'NF'

awk 'NF' - это удалит все пустые/пустые строки.

Дополнительная информация: cat filename.txt | awk 'NF' | awk '{$1=$1;print}' cat filename.txt | awk 'NF' | awk '{$1=$1;print}'

awk '{$1=$1;print}' - это удалит только конечные пробелы (как левые, так и правые)

Ответ 13

Для меня с 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 =============