Удаление пустых строк с помощью 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
вы, скорее всего, видите неожиданное поведение, потому что ваш текстовый файл был создан в 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 =============