Я могу придумать два способа сделать это.
Первый способ предполагает, что вы являетесь владельцем файла, но файл ЧИТАЕТСЯ.
Просто используйте суффикс восклицательного знака vi в команде записи (:w!) заставить перезаписать свой собственный файл READONLY. Это, конечно, предполагает, что у вас есть разрешение на запись и выполнение в текущей папке.
:w!
заставит vi перезаписать исходный файл READONLY.
Второй способ предполагает, что файл принадлежит кому-то другому, и вы хотели бы сохранить свои изменения в этом файле.
Один из способов сделать это - сохранить изменения, внесенные в исходный файл, в виде скрипта ed из vi. Этот сценарий ed может быть применен к исходному файлу (или другим аналогичным файлам) позднее, вне vi, с помощью редактора ed line.
Чтобы сохранить текущий сеанс редактирования в виде сценария ed, нужно передать исходное имя файла и отредактированный буфер vi в качестве стандартного ввода утилите diff с параметром командной строки --ed, т.е. отобразить различия в виде сценария ed.
Итак, предполагая отредактированный буфер vi, выполните следующее
:.,$!diff --ed [original_file] -
Это заменит все строки в текущем буфере (., $!) с помощью сценария diff, сгенерированного diff (diff --ed [original_file] -), необходимого для преобразования исходного файла в содержимое текущего буфера. Затем мы хотим сохранить этот сценарий ed в безопасном месте и применить сценарий к версии исходного файла, в который мы можем записать. Итак, сохраните сценарий в доступном для записи месте, например, в папке входа в систему:
:w ~/my_ed_script
Теперь выйдите из vi и используйте этот скрипт ed, чтобы получить отредактированный файл, который не удалось сохранить в первую очередь. Вот как это сделать из командной строки bash, '$':
$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file
То, что эта последовательность команд делает в словах, состоит в том, чтобы соединить сгенерированный нами скрипт с помощью diff и повторить команду ed write 'w' на стандартный ввод ed. Затем Эд применяет этот сценарий к доступной для записи копии исходного файла и записывает эти измененные изменения буфера обратно в файл.
Таким образом, это способ сохранить работу, выполненную в vi, в файл, который изначально принадлежал кому-то другому, используя vi, diff и ed.