Як видалити порожні / порожні рядки з файлу в Unix (включаючи пробіли)?


60

Як видалити порожні / порожні (включаючи лише пробіли) рядки з файлу в Unix / Linux за допомогою командного рядка?

вміст file.txt

Line:Text
1:<blank>
2:AAA
3:<blank>
4:BBB
5:<blank>
6:<space><space><space>CCC
7:<space><space>
8:DDD

вихід бажаний

1:AAA
2:BBB
3:<space><space><space>CCC
4:DDD



1
Це епічний відповідь , який в значній мірі дає всі можливі рішення , використовуючи Grep, SED, AWK: stackoverflow.com/questions/16414410 / ...
wisbucky

Відповіді:


86

Ця лінія sed повинна виконати трюк:

sed -i '/^$/d' file.txt

Це -iозначає, що він буде редагувати файл на місці.


13
Фактично потрібно "/ ^ * $ / d", щоб видалити рядки, які містять лише пробіли.
Шон Рейфшнайдер

2
@SeanReifschneider Ця вимога не полягала в тому, коли ця відповідь була написана?
kasperd

4
@SeanReifschneider Хіба "/ ^ \ s * $ / d" не буде кращим, оскільки він би містив вкладки? Хоча це не згадується в оригінальному дописі, мені здається більш сильним варіантом.
mrswadge


Я отримуюbad flag in substitute command: 'e'
ishandutta2007

29

grep

Просте рішення - за допомогою команди grep( GNU або BSD ), як показано нижче.

  • Видаліть порожні рядки (не включаючи рядки з пробілами).

    grep . file.txt
    
  • Видаліть повністю порожні рядки (включаючи рядки з пробілами).

    grep "\S" file.txt
    

Примітка. Якщо ви отримаєте небажані кольори, це означає, що ваш grepпсевдонім grep --color=auto(перевірити type grep). У цьому випадку ви можете додати --color=noneпараметр або просто виконати команду як \grep(що ігнорує псевдонім).


ripgrep

Схожий з ripgrep(підходить для набагато більших файлів).

Видаліть порожні рядки, не включаючи рядки з пробілами:

rg -N . file.txt

або включаючи рядки з пробілами:

rg -N "\S" file.txt

Дивитися також:


2
grep .видається найпростішим рішенням.
Лев

Недоліком grep .порівняно з іншими рішеннями є те, що воно виділить увесь текст червоним кольором. Інші рішення дозволяють зберегти оригінальні кольори. Порівняйте unbuffer apt search foo | grep .зunbuffer apt search foo | grep -v ^$
wisbucky

1
@wisbucky Ви бачите кольори, тому grepщо grep --color=autoу вашій системі чужі (перевірити за :) type grep. Ви можете запустити його як \grepабо використовувати --color=noneпараметр.
kenorb

@kenorb Якщо ви використовуєте grep --color=none ., ви отримаєте всі білий текст, який перекриває колір форматування оригінальної команди (приклад: apt search foo)
wisbucky

grep .відповідатимуть рядкам, що містять лише пробіли, які, за словами ОП, не бажають.
Джим Л.

27
sed '/^$/d' file.txt

d - команда sed для видалення рядка. ^$- це регулярний вираз, що відповідає лише порожньому рядку, початок рядка з подальшим закінченням рядка.


+1 для пояснення
Alex Raj Kaliamoorthy

Ця команда не дає такий самий вихід, як запитував ОП (він створює 5 рядків, а не 4).
kenorb

22

Для видалення відповідних порожніх рядків можна скористатися опцією -v з grep.

Подобається це

grep -Ev "^$" file.txt

4
Я не вірю, що вам потрібна -E, принаймні, не з GNU grep, але крім цього мені так приємно бачити, що це робиться з grep! Це те, до чого я прагну віддати перевагу щоденно; рядкові фільтри здаються мені кращими за рядкові редактори.
MadHatter

Якщо ви хочете пропустити коментовані та порожні рядки, особливо при роботі з конф-файлами, використовуйтеgrep -Ev '^#|^$' file.txt
Govind Kailas

7

Ось таке awkрішення:

awk NF file.txt

За допомогою Awk NFвстановлюйте лише непорожні рядки. Коли ця умова відповідає, Awk за замовчуванням - це надрукувати весь рядок.


6

Щоб видалити порожні рядки, ви можете видавити нові повторення рядка за допомогою tr:

cat file.txt | tr -s '\n' '\n'

Це створює 6 рядків, а не 4, як вимагає ОП.
kenorb

1

xargs, якщо ви не проти позбавити провідних пробілів

$ docker run -it --rm alpine sh
/ # cat <<eof > /tmp/file
> one
>
>   two
> three
>
>
>   four
> eof
/ # cat /tmp/file
one

  two
three


  four
/ # cat /tmp/file | xargs -n1
one
two
three
four

0

Ex / Vim

Ось метод за допомогою exредактора (частина Vim):

ex -s +'v/\S/d' -cwq test.txt

Для декількох файлів (редагувати на місці):

ex -s +'bufdo!v/\S/d' -cxa *.txt

Примітка: :bufdoКоманда не є POSIX .

Без зміни файлу (просто надрукуйте на стандартному виході):

cat test.txt | ex -s +'v/\S/d' +%p +q! /dev/stdin

0

Для мене команда @ martigin-heemels викинула помилку, яку виправили (тобто фіктивний парам i),

sed -i '' '/^$/d' file.txt


0

Мабуть, найпростішим способом видалення порожніх рядків (без пробілів) є використання cat -s:

$ cat -s file
$ some-command | cat -s

Принаймні, якщо ви не хочете редагувати файл на місці, але, наприклад, запишіть на термінал. Крім того, він не пов’язаний з будь-яким кумедним бізнесом з регулярними виразками, тому його легко запам'ятати навіть людям, які не є RE-дружелюбними.


Від man cat:

-s, --squeeze-blank never more than one single blank line

Можливо, вони відрізняються на різних ОС, але він був присутній на кількох Linuxes і OpenBSD востаннє, коли я перевіряв.

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