Я можу придумати два способи зробити це.
Перший спосіб передбачає, що ви володієте файлом, але файл - НАЙКРАДНО.
Просто використовуйте суфікс вигукального знака vi до команди write (: w!), Щоб змусити перезаписати власний файл READONLY. Звичайно, це передбачає, що у вас є дозвіл на запис та виконання у поточній папці.
:w!
призведе до того, що vi перезапише оригінальний файл НАЙДІЛЬНО
Другий спосіб передбачає, що хтось інший володіє файлом, і ви хочете зберегти свої зміни у цьому файлі.
Один із способів досягти цього - зберегти зміни, внесені до вихідного файлу, у вигляді редактору сценарію зсередини vi. Цей сценарій редагування може бути застосований до оригінального файлу (або інших подібних файлів) пізніше за межами vi з редактором рядка ed.
Спосіб збереження поточного сеансу редагування як редагування сценарію - це передавання вихідного імені файлу та відредагованого буфера vi в якості стандартного вводу до утиліти diff за допомогою перемикача командного рядка --ed, тобто відображення відмінностей як сценарію ed.
Отже, припускаючи відредагований буфер vi, виконайте наступне
:.,$!diff --ed [original_file] -
Це замінює всі рядки в поточному буфері (., $!) Розробленим сценарієм ed (diff --ed [original_file] -), необхідним для перетворення оригінального файлу у вміст поточного буфера. Потім ми хочемо зберегти цей ed-скрипт у безпечному місці та застосувати його до версії оригінального файлу, до якого ми можемо записати. Отже, збережіть скрипт у потрібному для запису місці, наприклад, у свою папку для входу:
:w ~/my_ed_script
Тепер вийдіть з vi та використовуйте цей скрипт ed, щоб отримати відредагований файл, який не вдалося зберегти в першу чергу. Ось як це зробити з командного рядка bash, '$':
$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file
Ця послідовність команд у словах полягає в тому, щоб катетувати сценарій, який ми створили з розрізненням, і повторює команду ed, «w», на стандартне введення ed. Потім Ед застосовує цей скрипт до записуваної копії оригінального файлу і записує ці зміни зміненого буфера назад у файл.
Таким чином, це спосіб зберегти роботу, виконану в vi, у файл, який спочатку належав хтось іншим, використовуючи vi, diff та ed.