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


Відповіді:


26

Тільки grepдля тих, хто не заробляє:

grep '[^[:blank:]]' < file.in > file.out

[:blank:], всередині діапазонів символів ( [...]), називається класом символів POSIX. Є кілька , як [:alpha:], [:digit:]... [:blank:]відповідає горизонтальному Пробільні (в Лока POSIX, що цей простір і вкладки, але і в інших місцях не можуть бути більше, як все символи Unicode горизонтального інтервалу в UTF8 локалях) , а [[:space:]]сірники горизонтальній і вертикальних білі символи пробілу (так само, як [:blank:]і додатки, такі як вертикальна вкладка, стрічка форми ...).

grep '[:blank:]'

Повернути б ті рядки , які містять будь-який із символів, :, b, l, a, nабо k. Класи символів розпізнаються лише в межах [...]та ^в межах, що [...]заперечують набір. Отже, [^[:blank:]]означає будь-який символ, окрім порожніх.


1
Чи повинен також бути $кінець рядка?
Майкл Дюрант

@MichaelDurrant Це не закріплено на обох сторонах
jordanm

1
@MichaelDurrant. [^[:blank:]]$буде відповідати лише рядкам, які закінчуються непорожнім. Ми хочемо, щоб у будь
Stéphane Chazelas

@StephaneChazelas Я спробував grep [: blank:] SOURCEFILE навіть ця команда працює. Я розумію [] для класів персонажів, чи можете ви, будь ласка, дати мені трохи уявлення про те, як це працює? фрагмент: blank: для мене новий.
Jamshed Ansari user3000272

Чи є випадки, коли grep -E '\S'б не вийшло?
terdon

21

Ось awk рішення:

$ awk NF file

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


Акуратно, це також видаляє лінії з пробілом.
Вісбукі

7

Як щодо:

sed -e 's/^[[:blank:]]*$//' source_file > newfile

або

sed -e '/^[[:blank:]]*$/d' source_file > newfile

тобто

Для кожного рядка замініть:

  • якщо воно починається ("^ ")
  • з пробілами або вкладками (" [[:blank:]]") нуль або більше разів (" *")
  • і тоді - кінець рядка (" $")

Більше інформації про: blank :: та інші спеціальні символи на http://www.zytrax.com/tech/web/regex.htm#special


4
[[:space:]]включає вкладки. Якби не ваш регулярний вираз, вийшов би з ладу, якщо пробіл слідує за вкладкою.
jordanm

Діапазони wctype(3)та isalpha(3)інструкції описують відповідність класів персонажів.
Йорданм

Ви можете видалити перший, який не відповідає на запитання.
Стефан Шазелас

@MichaelDurrant Ви можете, будь ласка, написати щось про [[: blank:]]?
Jamshed Ansari user3000272

Додана інформація для [[: blank ::]]. Стефане, чому не працює перший? Я думав // в кінці замінить рядок без нічого.
Майкл Дюрант

4

Ви можете використовувати sedкоманду для видалення порожніх рядків:

sed '/^$/d' in > out

Ця команда видаляє всі порожні рядки з файлу "в"


Це не видаляє рядки, що містять лише пробіл та вкладку, як конкретно вимагається.
dave_thompson_085

3

Схоже, я знайшов його не так швидко, але нарешті смішно:

| xargs -L1


1
Хороший короткий, але він робить і більше: також видаляйте провідні пробіли та вкладки.
jringoot

О, це виявляється ще більш здібним? - Приємно! ;-P
poige

1
І він обрізає рядки (за замовчуванням 1024 знаків) Дивіться manpages: linux.die.net/man/1/xargs
jringoot

Я все глибше
закохуюсь

0

Спробуйте колишнє :

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

Використовуйте таку команду:

grep '\S' FILE

який видаляє всі рядки, включаючи пробіли чи вкладки.

В іншому випадку для видалення, не включаючи рядки з пробілами / вкладками, використовуйте:

grep . FILE

Наприклад:

$  printf "line1\n\nline2\n \nline3\n" > FILE
$  cat -v FILE
line1

line2

line3
$  grep '\S' FILE
line1
line2
line3
$  grep . FILE
line1
line2

line3

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

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