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