Удалите пустые строки с помощью grep - PullRequest
134 голосов
/ 08 августа 2010

Я попробовал grep -v '^$' в Linux, и это не сработало.Этот файл поступил из файловой системы Windows.

Ответы [ 14 ]

251 голосов
/ 08 августа 2010

Попробуйте следующее:

grep -v -e '^$' foo.txt

Опция -e позволяет сопоставлять шаблоны регулярных выражений.

Одинарные кавычки вокруг ^$ заставляют его работать на Cshell. Другие оболочки будут счастливы с одинарными или двойными кавычками.

ОБНОВЛЕНИЕ: Это работает для меня с файлом с пустыми строками или «полностью пустым пространством» (например, строки Windows с окончаниями строк в стиле «\ r \ n»), в то время как приведенное выше удаляет только файлы с пустыми строками и стилем unix окончания строки:

grep -v -e '^[[:space:]]*$' foo.txt
49 голосов
/ 28 декабря 2015

Сохраняйте это простым.

grep . filename.txt
26 голосов
/ 08 августа 2010
$ dos2unix file 
$ grep -v "^$" file

Или просто просто awk

awk 'NF' file

Если у вас нет dos2unix, вы можете использовать такие инструменты, как tr

tr -d '\r' < "$file" > t ; mv t "$file"
12 голосов
/ 08 декабря 2012
grep -v "^[[:space:]]*$"

The -v makes it print lines that do not completely match

===Each part explained===
^             match start of line
[[:space:]]   match whitespace- spaces, tabs, carriage returns, etc.
*             previous match (whitespace) may exist from 0 to infinite times
$             match end of line

Выполнение кода -

$ echo "
> hello
>       
> ok" |
> grep -v "^[[:space:]]*$"
hello
ok

Чтобы понять, как и почему это работает, я рекомендую прочитать регулярные выражения.http://www.regular -expressions.info / tutorial.html

3 голосов
/ 10 февраля 2017

Вы можете удалить пустую строку в следующем примере:

grep . filename.txt
2 голосов
/ 15 февраля 2016

Если у вас есть последовательности из нескольких пустых строк в строке, и вы хотите, чтобы только одна пустая строка на последовательность, попробуйте

grep -v "unwantedThing" foo.txt | cat -s

cat -s подавляет повторяющиеся пустые выходные строки.

Ваш вывод будет идти от

match1



match2

до

match1

match2

Три пустые строки в исходном выводе будут сжаты или «сжаты» в одну пустую строку.

2 голосов
/ 31 августа 2015

То же, что и выше:

grep -v -e '^$' foo.txt

Здесь grep -e означает расширенную версию grep.«^ $» означает, что между ^ (начало строки) и $ (конец строки) нет символа.«^» и «$» являются символами регулярных выражений.

Таким образом, команда grep -v напечатает все строки, которые не соответствуют этому шаблону (между символами ^ и $ нет символов).

Таким образом удаляются пустые пустые строки

2 голосов
/ 08 августа 2010

Я предпочитаю использовать egrep, хотя в моем тесте с подлинным файлом с пустой строкой ваш подход работал нормально (хотя без кавычек в моем тесте). Это тоже сработало:

egrep -v "^(\r?\n)?$" filename.txt
1 голос
/ 08 августа 2010

Пытался изо всех сил, но это, кажется, работает (при условии, что \r кусает вас здесь)

printf "\r" | egrep -xv "[[:space:]]*"
0 голосов
/ 20 ноября 2016

egrep -v "^ \ s \ s +"

egrep уже выполняет регулярное выражение, и \ s - это пробел.

+ дублирует текущий шаблон.

^ для начала

...