Я пытаюсь удалить пустые строки, используя sed:
sed '/^$/d'
но мне не повезло с этим.
Например, у меня есть эти строки:
xxxxxx
yyyyyy
zzzzzz
и я хочу, чтобы это было так:
xxxxxx
yyyyyy
zzzzzz
Какой должен быть код для этого?
Я пытаюсь удалить пустые строки, используя sed:
sed '/^$/d'
но мне не повезло с этим.
Например, у меня есть эти строки:
xxxxxx
yyyyyy
zzzzzz
и я хочу, чтобы это было так:
xxxxxx
yyyyyy
zzzzzz
Какой должен быть код для этого?
В вашей "пустой" строке могут быть пробелы или символы табуляции. Используйте классы POSIX с sed
чтобы удалить все строки, содержащие только пробелы:
sed '/^[[:space:]]*$/d'
Более короткая версия, которая использует ERE, например, с gnu sed:
sed -r '/^\s*$/d'
(Обратите внимание, что sed НЕ поддерживает PCRE.)
Мне не хватает решения awk
:
awk 'NF' file
Что будет возвращено:
xxxxxx
yyyyyy
zzzzzz
Как это работает? Так как NF
означает "количество полей", эти пустые строки имеют 0 fiedls, так что awk оценивает от 0 до False и ни одна строка не печатается; однако, если есть хотя бы одно поле, оценка имеет значение True и делает awk
выполнение по умолчанию: распечатать текущую строку.
sed '/^$/d'
должно быть хорошо, ожидаете ли вы изменить файл? Если это так, вы должны использовать флаг -i
.
Возможно, эти строки не пустые, поэтому, если это так, посмотрите на этот вопрос Удалите пустые строки из txtfiles, удалите пробелы из начала и конца строки. Я верю что вы пытаетесь достичь.
Я считаю, что это самый простой и быстрый:
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
-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 на высокопроизводительном суперкомпьютерном кластере.
Еще более простой метод с использованием 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}'
- это удалит только конечные пробелы (как левые, так и правые)
Для меня с 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 =============