Как я могу удалить несколько строк в vi?


129

Я пытался следовать следующему:

Как удалить выделенный текст в редакторе VI

но

5dd

дает

E492: Команда не редактора: 5dd

Затем я попробовал:

5d

Что удаляет только одну строку. Как удалить несколько строк?


2
Насколько я помню, 5dd должен быть допустимым синтаксисом и должен удалять 5 строк, начиная с той, на которой находится курсор. Есть ли шанс, что CAPS LOCK включен, и вы используете раскладку клавиатуры, которая заставляет цифровые клавиши смещаться, когда это так?
Эрик Дж.

Ответы:


132

Похоже, вы вводите команды в командном режиме (он же «Ex-режим»). В этом контексте :5dудалил бы строку номер 5, ничего больше. Чтобы 5ddработать по назначению, то есть удалить пять следующих друг за другом строк, начинающихся с курсора, введите его в обычном режиме и не используйте перед командами префикс :.



142

Вы можете удалить несколько строк (диапазона), если знаете номера строк:

:[start_line_no],[end_line_no]d

Примечание: d означает удаление

где
start_line_no - это начальная строка, которую вы не хотите удалить, а end_line_no - конечная строка, которую вы не хотите удалять. Строки между началом и концом, включая начало и конец, будут удалены.

Например:

:45,101d

Строки между 45 и 101, включая 45 и 101, будут удалены.


14
Вы также можете использовать $для обозначения последней строки в файле. Так :45,$dудалил бы каждую строку от 45 до конца.
freethebees

Вы даже можете использовать такие шаблоны, как/<\/div>/
Björn

1
Если вы хотите начать диапазон с той линии, на которой вы сейчас находитесь, вы можете сделать это:.,[end_line_no]d
Джо,

15

Команды, перечисленные для использования в обычном режиме (префикс с :для командного режима).
Проверено в Vim.

По сумме строки:

  • Numdd - удалит пита линию ВНИЗ начиная отсчет от текущей позиции курсора (например , 5ddудалит текущую строку и 4 линии под ней => удаляет текущую строку и ( Num-1 ) линия под ним )
  • Numdk - удалят пита строки UP от текущей строки и самой текущей строки (например , 3dkудаляет текущую строку и 3 строки выше него => удаляет текущую строку и питы строки над ним )

По номерам строк:

  • dnumG - удалит строки из текущей строки (включительно) UP до номера строки num (включительно) (например, если курсор в данный момент находится на строке 5, d2Gбудут удалены строки 2-5 включительно)
  • dnumgg - удалит строки из текущей строки (включительно) ВНИЗ до номера строки num (включительно) (например, если курсор в данный момент находится на строке 2, d6ggбудут удалены строки 2-6 включительно)
  • ( только командный режим ) :num1 ,num2d - удалит строки номер строки num1 (включительно) ВНИЗ номер строки num2 (включительно) . Примечание: если num1 больше num2 - vim отреагируетBackwards range given, OK to swap (y/n)?

1
Это помогло мне, потому что я не понимал, что num 'd' 'd' пытался удалить под курсором. У меня был курсор внизу файла, который пытался удалить строки над курсором! Спасибо за помощь!
Джонатан Чад Фалинг

Удаление по номеру: ': <start>, $ d' удалит до конца файла.
Деволус

11

Если вы предпочитаете метод невизуального режима и подтверждаете номера строк, я хотел бы предложить вам другой простой способ.

пример

Я хочу удалить текст со строки 45 по строку 101.

Мой метод предлагает вам ввести следующую команду в командном режиме:

45Gd101G

Он гласит:

Перейдите к строке 45 ( 45G), затем удалите текст ( d) из текущей строки в строку 101 ( 101G).

Обратите внимание, что vimвы можете использовать ggвместо G.

Сравните с ответом @Bonnie Varghese:

:45,101d[enter]

Приведенная выше команда из его ответа требует ввода 9 раз, в том числе enter, где мой ответ требует ввода 8–10 раз. Таким образом, скорость моего метода сопоставима.

Лично я сам предпочитаю 45Gd101Gболее:45,101d , потому что я , как приставать к синтаксису команды ВП, в данном случае является:

+---------+----------+--------------------+
| syntax  | <motion> | <operator><motion> |
+---------+----------+--------------------+
| command |   45G    |        d101G       |
+---------+----------+--------------------+

8

d5d "разрезает" пять строк

Обычно я просто кидаю число посередине, например:

d7l = удалить 7 букв


7

Нажмите кнопку, Escчтобы убедиться, что вы не находитесь в режиме редактирования. Установите курсор на первую строку, которую нужно удалить. Войдите :5dd. Текущая строка и следующие четыре строки должны быть удалены.

Либо, если у вас включена нумерация строк ...

Нажмите кнопку, Escчтобы убедиться, что вы не находитесь в режиме редактирования. Введите, :#,#dгде '#' означает номера начальной и конечной строки, которую необходимо удалить.


Я не думаю, что это работает с двоеточием вначале.
Outcast

@PoeteMaudit Это действительные команды vi. Двоеточие заставляет vi перемещать курсор в нижнюю часть экрана и принимать команду редактора строки.
Кенстер

5
  1. Esc для выхода из режима вставки
  2. :1enter перейти к строке 1 (замените '1' на интересующую вас строку)
  3. 5dd удалить 5 строк (из текущей строки)

Тип (для пронумерованных строк).:set number


3

Если вы хотите удалить диапазон ПОСЛЕ запуска определенной строки, вы можете использовать что-то вроде этого

:g/^TMPDIR/ :.,+11d

Это удаляет 11 строк (включительно) после каждой встречи с ^TMPDIR.


0

это dxd, а не ddx

если вы хотите удалить 5 строк, наведите курсор на начало первой удаляемой строки и d5d


0

Чтобы удалить все строки, используйте - ESC gg dG Чтобы удалить несколько строк, скажем, 5, затем используйте ESC 5dd


-1

Это можно было сделать следующим образом ..

  1. Поместите курсор в то место, которое хотите удалить.
  2. Нажмите «v», чтобы начать визуальный выбор.
  3. Переместите курсор в позицию, которую вы хотите удалить, с помощью клавиши со стрелкой.
  4. Нажмите «d», чтобы удалить строки.
  5. Теперь сохраните и выйдите, используя ": x!"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.