Я спробував 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 '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