it-swarm.com.ru

Удалить пустые строки используя sed

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

sed '/^$/d'

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

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

xxxxxx


yyyyyy


zzzzzz

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

xxxxxx
yyyyyy
zzzzzz

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

297
jonas

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

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

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

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

(Обратите внимание: sed не поддерживает _ PCRE.)

554
Kent

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

awk 'NF' file

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

xxxxxx
yyyyyy
zzzzzz

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

72
fedorqui

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

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

52
Alberto Zaccagni
31
Oleg Mazko

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

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
28
Vadim

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

$ 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

13
ConMan

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

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

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

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

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

2
FauChristian

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

egrep -v "^$" file.txt
2
Lowbit

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

awk '!/^$/' file
xxxxxx
yyyyyy
zzzzzz
2
Claes Wikner

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

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

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

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

0
justincbagley