Как я могу удалить все строки в файле, используя vi?

269

Как я могу удалить все строки в файле, используя vi?

Сейчас я делаю это, используя что-то вроде этого, чтобы удалить все строки в файле:

echo > test.txt

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

Примечание: использование ddне является хорошим вариантом. Там может быть много строк.

Холодно
источник
5
Я думаю, что Д. должен работать.
MadTux
11
@MadTux, только если вы начинаете с первой строки. 1GdGбудет работать из любого места.
Holloway
1
echo | test.txtне является допустимой командой, если test.txtэто не исполняемый скрипт. Я предполагаю, что вы имеете в виду echo >test.txtвместо этого?
tripleee
Вы правы @tripleee
Холодный
5
Обратите внимание, что не используя vi, >test.txtдостаточно обрезать его до нулевой длины - не echoнужно.
abligh

Ответы:

473

В viделать

:1,$d

удалить все строки.

:Вводит команду (и перемещает курсор вниз).
Это 1,$указание того, над какими строками dдолжна работать следующая команда ( ). В этом случае диапазон от первой строки до последней строки (обозначен $, так что вам не нужно знать количество строк в документе).
Финал dобозначает удаление указанных строк.

Существует более короткая форма ( :%d), но я никогда не использую ее. Это :1,$dможет быть легче "приспособлено", например, :4,$-2dоставить только первые 3 и последние 2 строки, удалив остальные.

Энтон
источник
9
Про совет. Не болееESC+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd...
rdev5
2
@ rdev5 попробуй в .следующий раз повторить команду
Газихан Аланкус
169

В vi я использую

:%d

где

  • : говорит vi перейти в командный режим
  • % означает все строки
  • d : удалять

В командной строке

> test.txt

будет делать также.

В чем проблема с дд?

dd if=/dev/null of=test.txt

где

  • /dev/null специальный 0-байтовый файл
  • if это входной файл
  • of это выходной файл
Archemar
источник
Я думал, что используя ddмне нужно Pess для каждой строки в файле.
холодно
Хороший. Это проще, чем я ожидал ...
Холодное
11
Вы должны различать ddкоманду vi (которую имел в виду OP) и ddутилиту, которую вы приводите в качестве примера. Кроме того, > test.txtможет не работать должным образом в оболочках, отличных от bash (например, zsh).
depquid
1
@depquid Упс! теперь я подумаю об этом ...
Archemar
2
Или, : >test.txtчто очень незначительно дольше.
tripleee
53

Я бы порекомендовал вам просто сделать это (должно работать в любой POSIX-совместимой оболочке):

> test.txt

Если вы действительно хотите сделать это с помощью vi, вы можете сделать:

  • 1G (перейти к первой строке)
  • dG (удалить до последней строки)
Крис Даун
источник
30
@ Холод: ... один раз?
Крис Даун
5
Gпредставляет последнюю строку. Если вы находитесь на первой строке ( gg), dGуказывает vi удалить все строки из текущей строки (первой строки) до последней строки. Итак, вы делаете это в один выстрел.
unxnut
6
ggявляется специфическим для vim. Это 1Gв традиционном vi.
Стефан Шазелас,
1
Ваш синтаксис оболочки зависит от конфигурации некоторых оболочек. Интерактивные оболочки bash и zsh (по умолчанию zsh) могут ожидать ввода в STDIN после получения этой команды, и для фактической очистки файла требуется дополнительная клавиша <CTRL> + D. Возможность запуска также зависит от настроек CLOBBER. >| test.txt < /dev/nullявляется несколько более надежным, поскольку он всегда будет загромождать файл и избегать ожидания ввода на интерактивных терминалах.
Калеб
1
@Caleb: Как я уже говорил, в любой POSIX-совместимой оболочке. :-) Ни одна из этих двух ситуаций не является жалобой POSIX.
Крис Даун
28

Если ваш курсор находится на первой строке (если нет, введите: ggили 1G), то вы можете просто использовать dG. Это удалит все строки от текущей строки до конца файла. Поэтому, чтобы убедиться, что вы удалите все строки из файла, вы можете смешать обе вместе, что будет: ggdG(в командном режиме).

Или %dв режиме Ex, пример командной строки: vim +%d foo.bar.

Связанный: Как я могу удалить в VIM весь текст от текущей строки до конца файла?

kenorb
источник
3
+1 за эргономичность: 1, $ d. Не то чтобы наши пальцы не были настроены на то, чтобы все время печатать двоеточие; во всяком случае;)
Аарон Р.
2
Upvoted. dGэто то, что я всегда использую.
lunchmeat317
1
Я считаю, что это ( ggdG) самый простой метод в Vim. Причина, по которой этот ответ не одобряется как другие, заключается в том, что ggв чистом vi его нет?
thameera
27

Я ленивый чувак, и мне нравится быть простым. ggdGпять нажатий клавиш в том числеShift

ggидет к первой строке в файле, dявляется началом dглагола elete и Gявляется движением, чтобы перейти к нижней части файла. Более подробно, это перейти в начало файла и удалить все до конца плитки.

TankorSmash
источник
РВКР. Я тоже ленивый и использую :$dили :1,$dэто более быстрый способ (я пишу меньше символов) kkk
Cold
3
:%dХорошая альтернатива, так как вы также используете только 5 нажатий клавиш.
TankorSmash
1
@TankorSmash ggэто vimкоманда, а не vi.
Кириас
хороший улов, моя ошибка
TankorSmash
12

Перейти к началу файла и нажмите dG.

cppcoder
источник
5

Я всегда использую ggVG

  • gg переходит к началу текущего файла редактирования
  • V(с заглавной буквы v) выберет текущую строку. В этом случае первая строка текущего файла редактирования
  • G(с заглавной буквы g) перейдет к концу файла. В этом случае, поскольку я выбрал первую строку, Gвыделю весь текст в этом файле.

Затем вы можете просто нажать dили, xчтобы удалить все строки.

yegle
источник
Если вы используете dвертикально, он автоматически применяется аналогично. dlудаляет символ справа, djудаляет, например, строку вниз.
TankorSmash
3

обратите внимание, что в вашем вопросе echo > test.txtсоздается файл с одним разрывом строки, а не пустой файл.

Из оболочки рассмотрите возможность использования echo -n > test.txtили : > test.txt.

Хотя я обычно использую команду редактирования vi (я использую ggdG), вы также можете вызвать оболочку со ссылкой на текущий файл, например, так:

:!:>%

Это почти так же кратко, как ggdG, но сложнее набрать, и вы также должны подтвердить, что вы хотите перезагрузить измененный файл, поэтому я не особенно рекомендую его в этом случае, но знать, как использовать команды оболочки из vi, как это полезно.

ломая это:

  • : инициировать команду vi
  • ! инициировать команду оболочки
  • : это встроенная команда оболочки с пустым выводом
  • > перенаправить вывод
  • % vi заменяет это именем текущего файла

Предложенный вариант, :1,$dконечно, тоже хорош, и пока я на нем,1GdG

mc0e
источник
:!:>%также опасно, поскольку viне экранирует имя файла для оболочки (не делайте этого при редактировании файла, вызываемого, $(reboot)например). Вам нужно что-то:call system(":>" . shellescape(expand("%")))
Стефан Шазелас
3

Другое решение:

truncate -s 0 file
slawx
источник
Не совсем проще, >fileно хорошо.
phk
1
Кажется, это хороший метод, но цель делает это, используя vi. Tks
Холодная
-1

Вы можете использовать трюк, чтобы удалить большое количество строк. Убедитесь, что вы не находитесь в режиме вставки (нажмите ESC), затем введите 1000dd.

Radu
источник
1
Вы должны включить объяснение того, что команда делает / как она работает (удаляет следующие 1000 строк, что не удаляет все строки, если курсор не находится на первой строке).
Себастьян
вот почему я назвал это уловкой :)
Раду
-1

Я печатаю, ggчтобы достичь вершины линий, а затем сделать 100 dd. Это приводит указатель к верхней строке редактора и очищает оттуда 100 строк. Возможно, вам придется изменить число, чтобы добавить больше строк, если файл длиннее.

Атула
источник
-1
> file.txt

Вам даже не нужно открывать vi, если вы действительно не хотите.

тень
источник
1
Здравствуйте и добро пожаловать на сайт обмена стеками U & L. Пожалуйста, просмотрите справочный центр для получения информации о том, как лучше разместить этот сайт. Мы хотим развить информативные и уникальные вопросы и ответы на этом сайте. Ваш ответ идентичен другим ответам и комментариям к этому посту. Пожалуйста, отредактируйте свое сообщение, чтобы оно было более уникальным и информативным. Спасибо!
Kemotep
Кроме того, суть вопроса заключается в том, чтобы ... «использовать vi»
Джефф Шаллер
Я попробовал именно то, что вы предложили. Я получил bash: > file.txt: command not found.
roaima
@roaima Вы получите это, если процитируете это как "> file.txt".
Кусалананда
1
@JeffSchaller : vi >file.txt ;-)
Кусалананда