Видаліть порожні рядки за допомогою грейпу


Відповіді:


300

Спробуйте наступне:

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

Цей -eпараметр дозволяє схеми регулярного вирівнювання для відповідності.

^$Одиночні цитати змушують його працювати для Cshell. Інші оболонки будуть задоволені або окремими, або подвійними цитатами.

ОНОВЛЕННЯ: Для мене працює файл із порожніми рядками або "весь пробіл" (наприклад, рядки Windows із закінченнями рядка стилю "\ r \ n"), тоді як вищезазначене видаляє лише файли із порожніми рядками та закінченнями стилю unix:

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

Ця зграя працюватиме лише для файлів з нульовим або 1 пробілом у рядку, а не для файлів з 2 або більше пробілами. Змінити? до *.
Ед Мортон

4
Це має бути grep -E -v, все після -eінтерпретується як закономірність.
джазпі

6
grep -v -e '^[[:space:]]*$' -e '^#' fileнадасть вам усі порожні рядки без коментарів у сценарії чи конфігураційному файлі (або будь-який тип файлу, який використовує хеш-символ для коментарів).
palswim

-eMsgstr "Ця опція дозволяє схеми регулярного вирівнювання для відповідності." Це дуже вводить в оману . -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.
Єті

73

Не ускладнювати.

grep . filename.txt

1
це дає мені всі рядки у файлі
phuclv

2
@ LưuVĩnhPhúc Він повинен виводити всі рядки у файлі, крім порожніх рядків.
Фрей Конноллі

2
Це працює для мене на файлах із системи на базі Linux, але не на файлах з Windows. Імовірно через рядкових символів Windows.

Я заявляю про це, навіть якщо це не зовсім вирішує проблему ОП щодо обробки файлу із закінченнями рядків Windows, але оскільки у мене цього немає, це виявилося ідеальним рішенням для мене.
David Z

1
Це ідеальне рішення. Простий і працює в Linux.
W00f

30

Використання:

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

Або просто просто пробудьте:

awk 'NF' file

Якщо у вас немає dos2unix, ви можете використовувати такі інструменти, як tr :

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

Неможливо знайти програму dos2unix. Це для Windows? команда ask також не працює.
вузол ніндзя

запитати? Ні, це awk.
iconoclast

Хороший момент щодо перетворення закінчень рядків у стилі UNIX, інакше регулярні вирази можуть працювати не так, як очікувалося. Тут нічого не працювало для мене, поки я не перетворив закінчення рядків.
Райан Х.

16
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


2
Як і чому це працює? Ваша відповідь була б набагато кращою, якби ви могли пояснити. Наприклад, ваш регулярний вираз відповідає початку рядка, а потім одному або більше пробілів, використовуючи стандарт POSIX, а потім кінець рядка, тобто з grep -v він видаляє всі рядки, які є лише пробілами. Правильно? Що відбувається, якщо немає пробілів; це просто символ нового рядка?
Бен

Як показує мій приклад, видаляється навіть лише порожній рядок (перший рядок). Я додав більше інформації, тому, сподіваюся, це допомагає. :)
Сеперо

3

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

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

Спробував це. Порожні рядки все ще відображаються. Це може бути тому, що файл був зроблений у Windows?
вузол ніндзя

3

Якщо у вас є послідовності декількох порожніх рядків підряд, і ви хочете лише один порожній рядок на послідовність, спробуйте

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

cat -s пригнічує повторні порожні вихідні рядки.

Ваш вихід піде звідти

match1



match2

до

match1

match2

Три порожні рядки в вихідному висновку будуть стиснуті або «стиснуті» в один порожній рядок.



2

Те саме, що і попередні відповіді:

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

Тут grep -eмається на увазі розширена версія grep . '^ $' означає, що між ^ (початок рядка) і $ (кінець рядка) немає жодного символу. '^' і '$' - це символи регулярного виразки.

Отже команда grep -v буде надрукувати всі рядки, які не відповідають цьому шаблону (Немає символів між ^ і $).

Таким чином усуваються порожні порожні рядки.


-eне означає "розширена версія grep", можливо, вас плутають -E? У посібнику чітко сказано, що -eпросто явно сказано, що слідує шаблон. Оскільки шаблон не починається з тире, і ви все одно визначаєте лише один візерунок, ви також можете залишити його, оскільки за замовчуванням grep очікує один шаблон регулярного вираження: grep -v '^$' foo.txt(немає необхідності в розширеному функціональному режимі регексу). Також варто згадати, що це не усуває порожні рядки у файлі, лише ті, які пропускаються через висновок. У цьому випадку sed -iбуде правильним інструментом.
Єті

1

Я дуже старався, але це, здається, спрацює (якщо припустити \r, що вас тут кусає):

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

Це працює, якщо я заміню першу частину на вихід з файлу.
вузол ніндзя


0

egrep -v "^ \ s \ s +"

egrep вже робить регулярний вираз, і \ s - це пробіл.

+ Дублює поточний шаблон.

^ - для початку


0

Використання:

grep pattern filename.txt | uniq

uniqзменшить суміжні порожні рядки лише до одного порожнього рядка, але не видалить їх повністю. Все-таки мені подобається намагатися використовувати uniqтаке. Сортування спочатку ефективно видалить усі порожні рядки - залишивши лише один, але перестановка порядку рядків може бути неприйнятною.
Zach Young

Гарна думка. Це також дозволить повторити рядки. Я думаю, що моє рішення вводить помилки.
baitisj

0

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

[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

0

Це правда, що використання grep -v -e '^ $' може працювати, однак це не видаляє порожні рядки, у яких є 1 або більше пробілів . Я знайшов найпростішу і найпростішу відповідь на видалення порожніх рядків - це використання awk . Далі наведено трохи змінених у відповіді хлопців awk:

awk 'NF' foo.txt

Але оскільки це питання стосується використання grep, я збираюся відповісти на таке:

grep -v '^ *$' foo.txt

Примітка : порожній пробіл між ^ і *.

Або ви можете використовувати \ s для представлення порожнього простору таким чином:

grep -v '^\s*$' foo.txt
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.