Puedo pensar en dos formas de hacer esto.
La primera forma supone que es el propietario del archivo, pero el archivo es READONLY.
Simplemente use el sufijo de signo de exclamación de vi en el comando de escritura (: w!) Para forzar la sobrescritura de su propio archivo READONLY. Por supuesto, esto supone que tiene permiso para escribir y ejecutar en la carpeta actual.
:w!
hará que vi sobrescriba el archivo READONLY original.
La segunda forma supone que otra persona es propietaria del archivo y desea guardar los cambios en ese archivo.
Una forma de lograr esto es guardar los cambios realizados en el archivo original como un script ed desde vi. Este script ed puede aplicarse al archivo original (u otros archivos similares) en un momento posterior fuera de vi con el editor de línea ed.
Una forma de guardar la sesión de edición actual como un script ed es pasar el nombre del archivo original y el buffer vi editado como entrada estándar a la utilidad diff con el interruptor de línea de comando --ed, es decir, mostrar las diferencias como un script ed.
Entonces, suponiendo un búfer vi editado, luego realice lo siguiente
:.,$!diff --ed [original_file] -
Esto reemplaza todas las líneas en el búfer actual (., $!) Con el script ed generado por diff (diff --ed [original_file] -) necesario para convertir el archivo original en el contenido del búfer actual. Luego queremos guardar este script ed en un lugar seguro y aplicar el script a una versión del archivo original en el que podamos escribir. Por lo tanto, guarde el script en una ubicación de escritura, por ejemplo, su carpeta de inicio de sesión:
:w ~/my_ed_script
Ahora salga de vi y use este script ed para obtener el archivo editado que no se pudo guardar en primer lugar. Aquí se explica cómo lograrlo desde la línea de comandos de bash, '$':
$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file
Lo que esta secuencia de comandos hace en palabras es catear el script que generamos con diff y hace eco del comando ed write, 'w', en la entrada estándar de ed. Luego, Ed aplica este script a la copia editable del archivo original y escribe los cambios de búfer modificados nuevamente en el archivo.
Entonces, esa es una manera de guardar el trabajo realizado en vi en un archivo que originalmente había sido propiedad de otra persona que usa vi, diff y ed.