2010-08-08 3 views

ответ

199

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

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

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

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

UPDATE: Это работает для меня с файлом с пустыми строками или «всем белым пространством» (например, оконными линиями с окончанием строки стиля «\ r \ n»), тогда как выше всего удаляются файлы с пустыми строками и unix стиль линия окончания:

grep -v -e '^[[:space:]]*$' foo.txt 
+0

Это все еще показывает пустые строки. –

+0

См. Обновление к вопросу. – ars

+0

Да, это работает. Он также работает с grep. –

1

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

egrep -v "^(\r?\n)?$" filename.txt 
+0

Пробовал, что. Пустые строки все еще отображаются. Может ли это быть из-за того, что файл был сделан в Windows? –

1

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

printf "\r" | egrep -xv "[[:space:]]*" 
+0

Это работает, если я заменил первую часть на выход из файла. –

22
$ dos2unix file 
$ grep -v "^$" file 

Или просто AWK

awk 'NF' file 

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

tr -d '\r' < "$file" > t ; mv t "$file" 
+0

Не удается найти программу dos2unix. Это для Windows? команда ask также не работает. –

+0

спросить? Нет, это 'awk'. – iconoclast

+0

Хорошая мысль о преобразовании в конец строки в стиле UNIX, в противном случае регулярные выражения могут работать не так, как ожидалось. Ничто здесь не работало для меня, пока я не переработал окончание строки. –

12
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 

Запуск code-

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

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

+2

Как и почему это работает? Ваш ответ был бы намного лучше, если бы вы могли объяснить. Например, ваше регулярное выражение соответствует началу строки, затем одно или несколько пробелов с использованием стандарта POSIX, а затем конец строки, то есть с помощью grep -v он удаляет все строки, которые являются только пробелами. Правильно? Что произойдет, если нет пробелов; это просто символ новой строки? – Ben

+0

Как показывает мой пример, удаляется только пустая строка (первая строка). Я добавил дополнительную информацию, надеюсь, что это поможет. :) – Sepero

0

grep pattern filename.txt | уник

+0

'uniq' уменьшит смежные пустые строки только на одну пустую строку, но не удалит их полностью. Тем не менее, мне нравится пытаться использовать 'uniq'. Сначала сортировка эффективно удалит все пустые строки - оставив только одну, но переупорядочить порядок строк может быть неприемлемым. –

+0

Хорошая точка. Это также повторит повторяющиеся строки. Я предполагаю, что мое решение вводит ошибки. – baitisj

0
awk 'NF' file-with-blank-lines > file-with-no-blank-lines 
0

Использование Perl:

perl -ne 'print if /\S/' 

\S означает матч без пробелов.

0

вот еще один способ удаления белых линий и линий, начинающихся с # знака. Я думаю, что это очень полезно для чтения файлов конфигурации.

[[email protected] ~]# cat /etc/sudoers | egrep -v '^(#|$)' 
Defaults requiretty 
Defaults !visiblepw 
Defaults always_set_home 
Defaults env_reset 
Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR 
LS_COLORS" 
root ALL=(ALL)  ALL 
%wheel ALL=(ALL)  ALL 
stack ALL=(ALL) NOPASSWD: ALL 
1

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

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

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

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

Этот путь пустых пустых линий устранен

23

Держите его простым.

grep . filename.txt 
+0

это дает мне все строки в файле –

+1

@ LưuVĩnhPhúc. Он должен выводить все строки в файле, кроме пустых строк. –

+0

Это работает для меня на файлах из системы на основе Linux, но не на файлы из Windows. Предположительно из-за символов конца строки Windows. – ocertat

1

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

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

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

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

match1 



match2 

в

match1 

match2 

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

0

-v задать расширенное "^ \ s \ s +"

уже делают задать расширенное регулярное выражение, а \ s белое пространство.

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

^как для начала

4

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

grep . filename.txt 
Смежные вопросы