Vim удалить пустые строки


674

Какую команду можно запустить, чтобы удалить пустые строки в Vim?

Ответы:


1233
:g/^$/d

:gвыполнит команду в строках, которые соответствуют регулярному выражению. Регулярное выражение 'пустая строка' и команда :d(удалить)


38
Спасибо Soulmerge. Это мой любимый ответ, поскольку он фактически объясняет, что делает команда: g.
— Тим Суаст

4
Это удалит все пустые строки (не содержат символов пробела ..), но это может быть не единственным требованием. Кто-то еще может оставить одну пустую строку. :%!cat -sможет быть выбор ..
— Coanor

2
: g / ^ \ s * $ / d с регулярным выражением 'любой возможный пробел' в строке
— oyd11

180

Нашел это, это:

g/^\s*$/d

Источник: Power of g at vim wikia

Краткое объяснение :g

:[range]g/pattern/cmd

Это действует на указанный [диапазон] (по умолчанию весь файл), выполняя команду Exd cmd для каждого шаблона совпадения строки (команда Ex - это команда, начинающаяся с двоеточия, например :dдля удаления). Перед выполнением cmd " ." устанавливается на текущую строку.


9
Ницца. Но не совсем пустая строка.
— InnaM

13
Ах да, это будет соответствовать строки, содержащие только пробельные символы. Я приму ответ Соулмерге.
— почти в

16
это должно соответствовать пустым строкам и строкам, состоящим только из пробелов ... (* соответствует нулю или множеству экземпляров \ s ...)?
— monojohnny

14
Я бы сказал, что чистый пробел - это ТОЛЬКО пустая строка, тогда как ни один пробел на самом деле не является пустой строкой, не правда ли? ;)
— Kasapo

4
Оксфорд говорит, что пробел - это «место, которое нужно заполнить в документе». Интерпретируйте это, как вы можете, но это именно то, что я искал. Спасибо!
— Джо Трикарико

53
:v/./d

или

:g/^$/d

или

:%!cat -s

7
Аккуратный трюк с: v / ./ d (легче набрать), но тогда вам нужно сделать: nohl после.
— Клас Могрен

1
@ClaesMogren или просто подпрыгнуть на control-l
— jm3

6
@zladuric, согласно vim.wikia.com/wiki/Power_of_g, это глобальная версия (поэтому она выполняет команду для всего, что не совпадает)
— adam_0

44

Следующее можно использовать для удаления только нескольких пустых строк (уменьшите их до одной пустой строки) и оставив единственные пустые строки без изменений:

:g/^\_$\n\_^$/d

3
Может ли кто-нибудь объяснить, что означают токены? (Итак, как это работает?) Спасибо.
— PAStheLoD

5
\_$означает конец строки, который может быть использован внутри шаблона ( $может использоваться только в конце шаблона.) То же самое относится к тому, \_^что означает начало строки и может использоваться в любом месте внутри шаблона. Таким образом, шаблон соответствует пустой строке, новой строке и снова пустой строке. Смотрите страницу помощи Vim regex .
— Виктор Стрибьев

1
Еще один способ сделать то же самое::g/^$/,/./-j
— SergioAraujo

14
  1. как убрать все пустые строки

    :%s,\n\n,^M,g
    

    (сделать это несколько раз, используя все пустые строки исчезли)

  2. как убрать все пустые строки, оставив ОДИНОЧНУЮ пустую строку

    :%s,\n\n\n,^M^M,g
    

    (сделать это несколько раз)

  3. как удалить все пустые строки, оставив две пустые строки в максимуме,

    :%s,\n\n\n\n,^M^M^M,g
    

    (сделать это несколько раз)

для ввода ^ M, я должен контролировать-Q и контроль-M в окнах


2
Вы также можете использовать \rвместо Ctrl-M.
— dash-tom-bang

6

Как насчет:

:g/^[ \t]*$/d



5

Эта функция удаляет только две или более пустых строки, помещает строки ниже в ваш vimrc, затем использует \ d для вызова функции

fun! DelBlank()
   let _s=@/
   let l = line(".")
   let c = col(".")
   :g/^\n\{2,}/d
   let @/=_s
   call cursor(l, c)
endfun
map <special> <leader>d :keepjumps call DelBlank()<cr>

4

Я попробовал несколько ответов на этой странице, но многие из них не сработали для меня. Может быть, потому что я использую Vim на Windows 7 (не смейся, просто пожалей меня: p)?

Вот самый простой способ, который я нашел, который работает на Vim в Windows 7:

:v/\S/d

Вот более длинный ответ на Vim Wikia: http://vim.wikia.com/wiki/Remove_unwanted_empty_lines


3
:g/^\s*$/d
^ begin of a line
\s* at least 0 spaces and as many as possible (greedy)
$ end of a line

вставить

:command -range=% DBL :<line1>,<line2>g/^\s*$/d

в вашем .vimrc, затем перезапустите vim. если вы используете команду: 5,12DBL, она удалит все пустые строки между 5-й и 12-й строками. Я думаю, что мой ответ - лучший ответ!


При публикации ответов, пожалуйста, добавьте и объяснение, описывающее, что вы изменили или добавили или как это работает или что-то. Даже если ваш ответ может быть решением, некоторые люди, которые читают это, не понимают, что это значит или как это работает. И, пожалуйста, сделайте это на английском.
— Тим

Это действительно не имеет значения здесь. На этот вопрос принят ответ 5 лет назад
— Тим

Я думаю, что ответ Соулмерге: g / ^ $ / d не лучший ответ. И я редактирую, чтобы улучшить его ответ с помощью: g / ^ \ s * $ / d. но почему я не могу посмотреть мои правки в «показать все правки в этой позе»?
— cn8341

Мой ответ лучше его ответа, а кто отверг мой ответ и почему мой ответ был отклонен?
— cn8341

2

Если в вашем тексте есть что-то двойное, то эта команда удалит двойной интервал и объединит существующие повторяющиеся пустые строки в одну пустую строку. Он использует временный разделитель ^^^ в начале строки, поэтому, если это конфликтует с вашим контентом, выберите что-то еще. Строки, содержащие только пробелы, рассматриваются как пустые.

%s/^\s*\n\n\+/^^^\r/g | g/^\s*$/d | %s/^^^^.*

2

Нажмите deleteклавишу в режиме вставки, чтобы удалить пустые строки.


1

Это сработало для меня:

:%s/^[^a-zA-Z0-9]$\n//ig

Он в основном удаляет все строки, которые не имеют цифры или буквы. Поскольку все элементы в моем списке имели буквы, он удалил все пустые строки.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.