Як я можу видалити всі рядки у файлі за допомогою vi?


269

Як я можу видалити всі рядки у файлі за допомогою vi?

На даний момент я це роблю, використовуючи щось подібне, щоб видалити всі рядки у файлі:

echo > test.txt

Як можна видалити всі рядки за допомогою vi?

Примітка: Використання ddне є хорошим варіантом. Рядок може бути багато.


5
Я думаю, що dG повинен працювати.
MadTux

11
@MadTux, лише якщо ви починаєте з першого рядка. 1GdGпрацював би з будь-якого місця.
Холлоуей

1
echo | test.txtне є дійсною командою, якщо тільки test.txtце виконуваний скрипт. Я здогадуюсь, echo >test.txtнатомість ви маєте на увазі ?
трійчатка

Ви праві @tripleee
Cold

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

In vi я використовую

:%d

де

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

У командному рядку

> test.txt

зробимо також.

У чому проблема з dd?

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

де

  • /dev/null це спеціальний файл 0 байт
  • if - це вхідний файл
  • of є вихідним файлом

Я думав, що за допомогою ddмені потрібен песс для кожного рядка у файлі.
Холодний

Добре. Це простіше, ніж я очікував ...
Холодний

11
Вам потрібно розрізняти ddкоманду vi (що означав ОП) та ddутиліту, яку ви наводите на прикладі. Крім того, це > test.txtможе не працювати, як очікувалося, у снарядах, що не мають башти (наприклад, zsh).
depquid

1
@depquid Виходить! тепер я придумую це ...
Архемар

2
Або : >test.txtщо лише дуже незначно довше.
tripleee

53

Я рекомендую вам просто зробити це (має працювати в будь-якій оболонці, сумісній з POSIX):

> test.txt

Якщо ви дійсно хочете зробити це з vi, ви можете зробити:

  • 1G (перейти до першого рядка)
  • dG (видалити до останнього рядка)

30
@Cold: ... один раз?
Кріс Даун

5
Gпредставляє останній рядок. Якщо ви перебуваєте на першому рядку ( gg), dGвказує vi видалити всі рядки з поточного (першого) до останнього. Отже, ви робите це в один кадр.
unxnut

6
ggє специфічним для vim. Це 1Gв традиційному vi.
Stéphane Chazelas

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 весь текст із поточного рядка до кінця файлу?


3
+1 за те, що він більш ергономічний, ніж: 1, $ d. Не те, щоб наші пальці не були приєднані до набору товстої кишки весь час;)
Аарон Р.

2
Отримано. dGце те, що я завжди використовую.
обідне м’ясо317

1
Я вважаю цей ( ggdG) найпростіший метод у vim. Причина, яку ця відповідь не підтримує, як і інші, це те, що ggне існує в чистому vi?
thameera

27

Я ледачий чувак, і мені подобається все просто. ggdGце п'ять натискань клавіш, у тому числіShift

ggпереходить до першого рядка у файлі, dє початком dдієслова elete і Gє рухом перейти до нижньої частини файлу. Докладно, це перехід на початок файлу і видалення всього до кінця плитки.


rsrs. Я теж ледачий і використовую :$dабо :1,$dшвидший спосіб (я пишу менше символів) kkk
Холодний

3
:%dє хорошою альтернативою, оскільки ви також використовуєте лише 5 натискань клавіш.
TankorSmash

1
@TankorSmash gg- це vimкоманда, ні vi.
kyrias

хороший улов, моя помилка
TankorSmash


5

Я завжди користуюся ggVG

  • gg переходить до початку поточного файлу редагування
  • V(з великої літери v) вибере поточний рядок. У цьому випадку перший рядок поточного файлу редагування
  • G(з великої літери) перейде до кінця файлу. У цьому випадку, оскільки я вибрав перший рядок, Gвибере весь текст у цьому файлі.

Тоді ви можете просто натиснути dабо xвидалити всі рядки.


Якщо ви використовуєте dвертикально, він автоматично застосовується лінійно. dlвидаляє символ праворуч, наприклад, djвидаляє рядок вниз.
TankorSmash

3

зауважте, що у вашому запитанні echo > test.txtстворюється файл із перервою в одному рядку, а не порожнім файлом.

З оболонки розглянути можливість використання echo -n > test.txtабо : > test.txt.

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

:!:>%

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

розбивши його:

  • : ініціювати команду vi
  • ! запровадити команду оболонки
  • : це вбудована команда оболонки з порожнім виходом
  • > перенаправити вихід
  • % vi замінює це ім'ям поточного файлу

Запропонований :1,$dваріант також, звичайно, хороший, і я просто там, поки я на ньому1GdG


:!:>%також небезпечний тим, viщо не уникає імені файлу для оболонки (не робіть цього під час редагування файла, який називається, $(reboot)наприклад). Вам знадобиться щось:call system(":>" . shellescape(expand("%")))
Stéphane Chazelas

3

Ще одне рішення:

truncate -s 0 file

Не дуже просто, >fileале добре.
phk

1
Здавалося б, це хороший метод, але мета - це робити за допомогою vi. Tks
Холодний


-1

Ви можете скористатися хитрістю, щоб видалити велику кількість рядків. Переконайтеся, що ви не перебуваєте в режимі вставки (натисніть ESC), а потім наберіть 1000dd.


1
Ви повинні включити пояснення того, що робить команда / як вона працює (видаляє наступні 1000 рядків, які не видаляють усі рядки, якщо курсор не знаходиться в першому рядку).
sebasth

саме тому я назвав це трюком :)
Раду

-1

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


-1
> file.txt

Вам навіть не потрібно відкривати vi, якщо ви цього не хочете.


1
Привіт і ласкаво просимо на сайт обміну стеками U&L. Перегляньте довідковий центр, щоб дізнатися, як найкраще розмістити цей сайт. Ми хочемо виробити на цьому сайті інформативні та унікальні запитання та відповіді. Ваша відповідь ідентична іншим відповідям та коментарям до цієї публікації. Будь ласка, відредагуйте своє повідомлення, щоб отримати більш унікальну та інформативну відповідь. Дякую!
kemotep

Крім того, питання питання полягає у ... "використанні vi"
Джефф Шаллер

Я спробував саме те, що ви запропонували. Я отримав bash: > file.txt: command not found.
roaima

@roaima Ви отримаєте це, якщо цитуєте річ як "> file.txt".
Kusalananda

1
@JeffSchaller : vi >file.txt ;-)
Kusalananda
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.