14 ответов:
попробуйте следующее:
grep -v -e '^$' foo.txtThe
-eопция позволяет шаблоны регулярных выражений для сопоставления.одинарные кавычки вокруг
^$делает его работать для Cshell. Другие оболочки будут довольны либо одинарными, либо двойными кавычками.UPDATE: это работает для меня для файла с пустыми строками или "все пробелы" (например, строки windows с окончаниями строк стиля "\r\n"), тогда как выше только удаляет файлы с пустыми строками и строкой стиля unix окончание:
grep -v -e '^[[:space:]]*$' foo.txt
$ dos2unix file $ grep -v "^$" fileили просто awk
awk 'NF' fileЕсли у вас нет dos2unix, то вы можете использовать такие инструменты, как tr
tr -d '\r' < "$file" > t ; mv t "$file"
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
Я предпочитаю использовать
egrep, хотя в моем тесте с подлинным файлом с пустой строкой ваш подход работал нормально (хотя и без кавычек в моем тесте). Это тоже сработало:egrep -v "^(\r?\n)?$" filename.txt
то же, что и выше ответы
grep -v -e '^$' foo.txtздесь grep-e означает расширенную версию grep. '^$'означает, что между ^(начало строки) и $(конец строки) нет символа. '^'и' $ ' являются символами регулярных выражений.
таким образом, команда grep-v напечатает все строки, которые не соответствуют этому шаблону (без символов между ^ и $).
таким образом, пустые пустые строки исключаются
если у вас есть последовательности из нескольких пустых строк в строке, и хотели бы только одну пустую строку в последовательности, попробуйте
grep -v "unwantedThing" foo.txt | cat -s
cat -sподавляет повторяющиеся пустые выходные линии.ваш выход из
match1 match2до
match1 match2три пустые строки в исходном выводе будут сжаты или" сжаты " в одну пустую строку.
старался, но это, кажется, работает (если
\rкусает тебя здесь)printf "\r" | egrep -xv "[[:space:]]*"
вот еще один способ удаления белых линий и строки, начинающиеся со знака#. Я думаю, что это очень полезно для чтения файлов конфигурации.
[root@localhost ~]# 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
egrep-v " ^\s\s+"
egrep уже делает регулярное выражение, а \s-пустое пространство.
+ дублирует текущий шаблон.
это ^ для начала
Comments