Видаліть 100 рядків з редактора vi, використовуючи одну команду


33

Я використовую Ubuntu і намагаюся видалити всі 100 рядків з viредактора, але у мене виникло питання інтерв'ю про це в одній команді.


Не рішення VI, а з командного рядка: echo -n > <file>видаляє всі рядки з файлу (насправді просто перезаписує файл на "").
azz

3
@Der Для цього зовсім не потрібно використовувати echo; > $fileпрацює просто чудово.
CVn

4
Що це за компанія, яка задає питання про viінтерв'ю?
CVn

2
На це питання легко відповісти рудиментарними знаннями vi. На комп'ютері з встановленим vim (на Ubuntu я рекомендував би vim-gtkпакет, оскільки це дає вам доступ до xclipboard у межах vim), введіть vimtutorу командному рядку (не в межах vim), щоб отримати інтерактивний підручник з основ. Це не повинно зайняти більше півгодини, і це найкращий посібник для початківців щодо використання vi / vim, який ви, швидше за все, знайдете.
злий

1
@ MichaelKjörling Я міг би уявити, що він з'явиться в інтерв'ю, якби заявник або згадав попередній досвід vi(усно чи через резюме), або якщо питання було попередньо: "Гаразд, як систематик, ви повинні знати щось із редакторів командного рядка, правильно" "Ви звикли vi?"
Wildcard

Відповіді:


62

У звичайному режимі робіть

100dd

ddвидаляє поточний рядок. Завдяки цій команді, 100вона повторює 100 разів.

Якщо у файлі менше 100 рядків, починаючи з поточного рядка, залежно від viреалізації, він або не зможе видалити будь-який, або видалити стільки, скільки їх є. У випадку vim, це залежить від того, cpвключена compatibleопція aka .


помиляється, лише видаляючи поточний рядок
Майур Мехта

Я хочу видалити 100 рядків за допомогою однієї команди одночасно
Майур Мехта

13
100ddє правильною відповіддю. Цікаво, що ти робиш.
ott--

1
@mayurMehta не знає, яка компанія задає подібні питання, і не знає, що вони очікують як відповідь. Але будь-який новачок VI користувача буде знати, що 100dd - це правильна відповідь.
Мунім

1
@vgoff Я не знаю .. Якщо вони не шукають загального рішення, щоб перевірити свої основні навички vim, то це просто хитромудрі питання, щоб спокусити респондентів. Я б сказав, що відповідь 100dd. Якщо інтерв'юер запитає "Що станеться, якщо у файлу менше 100 рядків від поточного курсору?", Я відповів би: "Команда видаляє те, що може, з поточного курсору." Це цілком розумно. Якщо інтерв'юер не з’ясує, чому курсор не буде на першому рядку? Я ненавиджу такі хитрі питання.
Мунім

44
  1. видаліть 100 рядків вперед (включаючи) поточного

    • повторити dd (видалити поточний рядок) 100 разів:

      100dd
      
    • видалити з поточного рядка на 99 рядків вперед

      d99j
      
  2. видаліть 100 рядків назад із (включаючи) поточного

    d99k
    
  3. видалити рядки в певному діапазоні за номером рядка

    :1,100d
    
  4. видалити рядки в діапазоні, починаючи з поточного рядка

    :.,.+99d
    

тощо.


2
номер 4 видалить поточний рядок (0) до 101-го (0 + 100) рядків, отже 101 рядок замість запитуваного 100. спробуйте:.,+99d
Олів'є Дулак

Драт, і я виправив правильні! Спасибі.
Марно

100dd теж не працював для мене - але №4 вище працює для мене в VI під Solaris 10.
DemiSheep

8

Якщо всі рядки у файлі потрібно видалити, ця команда vi вказує діапазон видалення:

:1,$d

1позначає перший рядок і $позначає останній рядок


або :%d (у ":" контексті, ":% ..." - це ярлик для ": 1, $ ...")
Олів'є Дулак

також приємно: d Gклавіші & rarr; знищити весь вміст від фактичного [напр. верхнього рядка] до нижнього рядка
erch

3

Ви хочете видалити всі рядки у файлі? Відкрийте файл за допомогою vi. Хоча на початку першого рядка - місце розташування курсору за замовчуванням, коли ви просто відкриваєте файл, натисніть, Escа потім -dG .

Зауважимо лише, що дія dвказує на видалення та Gвказує останній рядок файлу. Отже, перебуваючи на будь-якому рядку, ти натискаєшdG він видаляє весь рядок, починаючи з поточного рядка до останнього.

Якщо ви знаєте , які послідовні рядки для видалення - скажімо, від лінії 101 до 200 - типу в наступних ключових послідовності: Esc:101,200d.


Не потрібно натискати клавішу Escape, якщо ви тільки що відкрили файл і перебуваєте на початку файлу. Ви перебуваєте автоматично (за замовчуванням) у звичайному режимі.
vgoff

3

Неважливо, де ви знаходитесь у файлі, ви можете це зробити ggdG

:%dбуло б краще при менших натисканнях клавіш. Ну, рахуючи клавіші shiftі enter, насправді ще два натискання клавіш, ніж вище.

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


0

Esc n dd. n - кількість рядків, які слід видалити з поточного рядка і включати їх. Натисніть кнопку "Esc", потім "n", а потім "dd". Для кращого розуміння


У чому тут необхідність втечі
Prvt_Yadav

Ця відповідь ідентична прийнятій відповіді.
Кусалаланда

Escape - це лише на випадок, якщо ви перебуваєте в режимі вставки.
Ріда Абід
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.