Я пытаюсь удалить пустые строки с помощью 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.)
-r
sed -i "" '/^[[:space:]]*$/d'
<filename>
,
^\s*$
будет соответствовать всем «пустым» строкам, здесь означает «пустое», строка не содержит символов или строка содержит только пустые строки (например, пробелы). Все совпавшие строки будут удалены командой sed d
.
Мне не хватает awk
решения:
awk 'NF' file
Который вернется:
xxxxxx
yyyyyy
zzzzzz
Как это работает? Так как NF
обозначает «количество полей», эти строки, которые являются пустыми, имеют 0 строк, так что awk оценивает 0 как False и строка не печатается; однако, если есть хотя бы одно поле, оценка имеет значение True и awk
выполняет свое действие по умолчанию: вывести текущую строку.
$ time (topic companies <data.tpx | awk 'NF' - | awk -f dialog_menu.awk -)
real 0m0.006s
user 0m0.000s
sys 0m0.008s
$ time (topic companies <data.tpx | gsed '/^\s*$/d' | awk -f dialog_menu.awk -)
real 0m0.014s
user 0m0.002s
sys 0m0.006s
знаете ли вы изящный способ включить это в сценарий awk, например, в шаблон? awk '/ mypattern / {do stuff ...}'
awk 'NF {do stuff...}'
.
sed '/^$/d'
должно быть хорошо, вы ожидаете изменить файл на месте? Если это так, вы должны использовать-i
флаг.
Возможно, эти строки не пусты, поэтому, если это так, посмотрите на этот вопрос. Удалите пустые строки из txtfiles, удалите пробелы в начале и конце строки. Я считаю, что это то, чего вы пытаетесь достичь.
sed -i '/^$/d'
это один из способов сделать это.
[]
должен не быть экранированы в выражении скобки, поэтому здесь код не является правильным для\[\[:space:\]\]
или \[ \t\]
- должно быть [[:space:]]
и [ \t]
.
Я считаю, что это самый простой и быстрый:
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
cat
, также grep
принимает файлы:grep . file.txt
grep '\S'
определенно не портативен. Если у вас есть, grep -P
то вы можете использовать, grep -P '\S'
но это поддерживается не на всех платформах.
grep .
сравнению с другими решениями является то, что он выделит весь текст красным цветом. Другие решения могут сохранить оригинальные цвета. Сравните unbuffer apt search foo | grep .
сunbuffer apt search foo | grep -v ^$
С помощью принятого ответа здесь и принятого ответа выше, я использовал:
$ 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
, awk
, perl
и т.д.
strings $file > $output
strings - печатать строки печатаемых символов в файлах.
strings
вместо string
?
Это работает и в awk.
awk '!/^$/' file
xxxxxx
yyyyyy
zzzzzz
Скорее всего, вы видите неожиданное поведение, потому что ваш текстовый файл был создан в Windows, поэтому конец строки строки \r\n
. Вы можете использовать dos2unix, чтобы преобразовать его в текстовый файл в стиле UNIX перед тем, как запускать sed или использовать
sed -r "/^\r?$/d"
удалить пустые строки независимо от того, есть ли возврат каретки.
-r
делает флаг, и можно ли его объединить, -i
чтобы напрямую изменить файл и избежать печати на экране. Кроме того, я думаю, что эта команда также будет работать какsed -r "/^\r$/d"
Мой bash
специфический ответ - рекомендовать для этого использовать perl
оператор подстановки с глобальным g
флагом шаблона :
$ perl -pe s'/^\n|^[\ ]*\n//g' $file
xxxxxx
yyyyyy
zzzzzz
Этот ответ иллюстрирует учет наличия или отсутствия пустых строк в них ( [\ ]*
), а также использование |
для разделения нескольких поисковых терминов / полей. Протестировано на macOS High Sierra и CentOS 6/7.
Кстати, оригинальный код 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 =============