Я пытался grep -v '^$'
в Linux, и это не сработало. Этот файл пришел из файловой системы Windows.
Я пытался grep -v '^$'
в Linux, и это не сработало. Этот файл пришел из файловой системы Windows.
Ответы:
Попробуйте следующее:
grep -v -e '^$' foo.txt
-e
Опция позволяет шаблоны регулярных выражений для согласования.
Одиночные кавычки ^$
заставляют его работать на Cshell. Другие оболочки будут счастливы с одинарными или двойными кавычками.
ОБНОВЛЕНИЕ: Это работает для меня с файлом с пустыми строками или «полностью пустым пространством» (например, строки Windows с окончаниями строк в стиле «\ r \ n»), в то время как приведенное выше удаляет только файлы с пустыми строками и окончаниями строк в стиле Unix:
grep -v -e '^[[:space:]]*$' foo.txt
grep -E -v
, все после -e
интерпретируется как шаблон.
grep -v -e '^[[:space:]]*$' -e '^#' file
выдаст вам все непустые строки без комментариев в скрипте или файле конфигурации (или любой тип файла, который использует хеш-символ для комментариев).
-e
Msgstr " Опция позволяет использовать регулярные выражения для сопоставления." Это очень вводит в заблуждение . -e
является (POSIX-) определением для: This can be used to specify multiple search patterns, or to protect a pattern beginning with a hyphen (-).
(из руководства ). Grep уже ожидает (базовое) регулярное выражение по умолчанию. Для этой модели, вы можете оставить в -e
полностью: grep -v '^[[:space:]]*$' foo.txt
.
Будь проще.
grep . filename.txt
Использование:
$ dos2unix file
$ grep -v "^$" file
Или просто просто awk:
awk 'NF' file
Если у вас нет dos2unix, вы можете использовать такие инструменты, как tr :
tr -d '\r' < "$file" > t ; mv t "$file"
awk
.
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 "unwantedThing" foo.txt | cat -s
cat -s
подавляет повторяющиеся пустые выходные строки.
Ваш вывод будет идти от
match1
match2
в
match1
match2
Три пустые строки в исходном выводе будут сжаты или «сжаты» в одну пустую строку.
Так же, как и предыдущие ответы:
grep -v -e '^$' foo.txt
Здесь grep -e
означает расширенную версию grep . '^ $' означает, что между ^ (начало строки) и $ (конец строки) нет никаких символов. «^» и «$» являются символами регулярных выражений.
Таким образом, команда grep -v
напечатает все строки, которые не соответствуют этому шаблону (между символами ^ и $ нет символов).
Таким образом, пустые пустые строки удаляются.
-e
не означает "расширенная версия grep", может быть, вы запутались -E
? В руководстве четко сказано, что -e
просто явно сказано, что шаблон следует. Поскольку шаблон начинается не с тире, и вы все равно определяете только один шаблон, вы можете с тем же успехом опустить его, поскольку по умолчанию grep ожидает один шаблон регулярного выражения: grep -v '^$' foo.txt
(нет необходимости в расширенных функциях регулярного выражения). Также стоит отметить, что это не устраняет пустые строки в файле, а только то, что передается по выводу. Для этого случая, sed -i
будет правильным инструментом.
Я очень старался, но, похоже, это работает (при условии, \r
что кусает вас здесь):
printf "\r" | egrep -xv "[[:space:]]*"
Использование Perl:
perl -ne 'print if /\S/'
\S
означает совпадение непустых символов.
egrep -v "^ \ s \ s +"
egrep уже выполняет регулярное выражение, а \ s - это пробел.
+ Дублирует текущий шаблон.
^ Для начала
Использование:
grep pattern filename.txt | uniq
uniq
уменьшит соседние пустые строки до одной пустой строки, но не удалит их полностью. Тем не менее, мне нравится пытаться использовать uniq
таким образом. Сортировка в первую очередь эффективно удалит все пустые строки, оставив только одну, но перестановка порядка строк может оказаться неприемлемой.
Вот еще один способ удаления белых линий и линий, начинающихся со #
знака. Я думаю, что это очень полезно для чтения файлов конфигурации.
[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
Это правда, что использование grep -v -e '^ $' может работать, однако оно не удаляет пустые строки, в которых есть 1 или более пробелов . Я нашел самый простой и простой ответ для удаления пустых строк - использование awk . Следующее является измененным немного от парней awk выше:
awk 'NF' foo.txt
Но так как этот вопрос касается использования grep, я собираюсь ответить на следующее:
grep -v '^ *$' foo.txt
Примечание : пробел между ^ и *.
Или вы можете использовать \ s для представления пустого пространства следующим образом:
grep -v '^\s*$' foo.txt