Je peux penser à deux façons de le faire.
La première façon suppose que vous êtes propriétaire du fichier, mais le fichier est READONLY.
Il suffit d'utiliser le suffixe point d'exclamation de vi à la commande write (:w !) pour forcer l'écrasement de votre propre fichier READONLY. Cela suppose bien sûr que vous ayez la permission d'écrire et d'exécuter dans le dossier actuel.
:w!
fera en sorte que vi écrase le fichier READONLY d'origine.
La deuxième méthode suppose que quelqu'un d'autre possède le fichier et que vous souhaitez enregistrer vos modifications dans ce fichier.
Une façon d'y parvenir est d'enregistrer les modifications apportées au fichier original en tant que ed script à partir de vi. Ce ed script peut être appliqué au fichier original (ou à d'autres fichiers similaires) ultérieurement en dehors de vi avec l'éditeur de ligne ed.
Une façon d'enregistrer la session d'édition en cours comme un ed script est de passer le nom du fichier original et le vi buffer édité comme entrée standard à l'utilitaire diff avec le commutateur de ligne de commande --ed c'est-à-dire afficher les différences comme un ed script.
Donc, en supposant que le tampon vi a été édité, effectuez les opérations suivantes
:.,$!diff --ed [original_file] -
Cela remplace toutes les lignes du Tampon actuel (.,$ !) par le diff généré ed script (diff --ed [fichier_original] -) nécessaire pour convertir le fichier original en contenu du Tampon actuel. Nous voulons ensuite sauvegarder ce ed script dans un endroit sûr, et appliquer le script à une version du fichier original sur laquelle nous pouvons écrire. Donc, enregistrez le script à un endroit où l'on peut écrire, par exemple, votre dossier de connexion :
:w ~/my_ed_script
Maintenant, quittez vi, et utilisez ce ed script pour obtenir le fichier édité qui n'a pas pu être sauvegardé en premier lieu. Voici comment accomplir cela depuis l'invite de la ligne de commande bash, '$' :
$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file
Ce que cette séquence de commandes fait en mots est de caténiser le script que nous avons généré avec diff et de renvoyer la commande d'écriture de ed, 'w', vers l'entrée standard de ed. Ed applique ensuite ce script à la copie inscriptible du fichier d'origine, et réécrit ces modifications du buffer dans le fichier.
Il s'agit donc d'un moyen de sauvegarder le travail effectué en vi dans un fichier qui appartenait à l'origine à quelqu'un d'autre en utilisant vi, diff et ed.