Eu posso pensar em duas maneiras de fazer isso.
A primeira maneira assume que você possui o arquivo, mas o arquivo é READONLY.
Basta usar o sufixo do ponto de exclamação do vi no comando write (: w!) Para forçar a substituição do seu próprio arquivo READONLY. Obviamente, isso pressupõe que você tenha permissão para escrever e executar na pasta atual.
:w!
fará com que o vi substitua o arquivo READONLY original.
A segunda maneira assume que outra pessoa é proprietária do arquivo e você deseja salvar suas alterações nesse arquivo.
Uma maneira de conseguir isso é salvar as alterações feitas no arquivo original como um script ed no vi. Este script ed pode ser aplicado ao arquivo original (ou outros arquivos similares) posteriormente, fora do vi, com o editor de linha ed.
Uma maneira de salvar a sessão de edição atual como um script ed é passar o nome do arquivo original e o buffer vi editado como entrada padrão para o utilitário diff com a opção de linha de comando --ed, ou seja, exibir diferenças como um script ed.
Portanto, assumindo um buffer vi editado, execute o seguinte
:.,$!diff --ed [original_file] -
Isso substitui todas as linhas no buffer atual (., $!) Pelo script ed gerado por diff (diff --ed [original_file] -) necessário para converter o arquivo original no conteúdo do buffer atual. Em seguida, queremos salvar esse script ed em um local seguro e aplicá-lo a uma versão do arquivo original em que podemos gravar. Portanto, salve o script em um local gravável, por exemplo, na sua pasta de login:
:w ~/my_ed_script
Agora saia do vi e use este script ed para obter o arquivo editado que não pôde ser salvo em primeiro lugar. Aqui está como fazer isso no prompt da linha de comando do bash, '$':
$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file
O que essa sequência de comandos faz em palavras é catenar o script que geramos com diff e ecoa o comando ed write, 'w', para a entrada padrão de ed. Ed então aplica esse script à cópia gravável do arquivo original e grava essas alterações de buffer modificadas novamente no arquivo.
Portanto, essa é uma maneira de salvar o trabalho realizado no vi em um arquivo originalmente pertencente a outra pessoa usando vi, diff e ed.