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.