Ich kann mir zwei Möglichkeiten vorstellen, dies zu tun.
Der erste Weg geht davon aus, dass Sie die Datei besitzen, aber die Datei ist READONLY.
Verwenden Sie einfach das Ausrufezeichen-Suffix von vi für den Schreibbefehl (: w!), Um das Überschreiben Ihrer eigenen READONLY-Datei zu erzwingen. Dies setzt natürlich voraus, dass Sie die Berechtigung zum Schreiben und Ausführen im aktuellen Ordner haben.
:w!
bewirkt, dass vi die ursprüngliche READONLY-Datei überschreibt.
Die zweite Möglichkeit setzt voraus, dass jemand anderes Eigentümer der Datei ist und Sie Ihre Änderungen in dieser Datei speichern möchten.
Eine Möglichkeit, dies zu erreichen, besteht darin, die an der Originaldatei vorgenommenen Änderungen in vi als Ed-Skript zu speichern. Dieses ed-Skript kann zu einem späteren Zeitpunkt außerhalb von vi mit dem ed-Zeileneditor auf die Originaldatei (oder andere ähnliche Dateien) angewendet werden.
Eine Möglichkeit, die aktuelle Editiersitzung als Editierskript zu speichern, besteht darin, den ursprünglichen Dateinamen und den bearbeiteten Vi-Puffer als Standardeingabe an das Dienstprogramm diff mit der Befehlszeilenoption --ed zu übergeben, dh Unterschiede als Editierskript anzuzeigen.
Gehen Sie also unter der Annahme eines bearbeiteten vi-Puffers wie folgt vor
:.,$!diff --ed [original_file] -
Dadurch werden alle Zeilen im aktuellen Puffer (., $!) Durch das diff-generierte ed-Skript (diffed [original_file] -) ersetzt, das zum Konvertieren der Originaldatei in den Inhalt des aktuellen Puffers erforderlich ist. Anschließend möchten wir dieses ed-Skript an einem sicheren Ort speichern und das Skript auf eine Version der Originaldatei anwenden, in die wir schreiben können. Speichern Sie das Skript an einem beschreibbaren Ort, beispielsweise in Ihrem Anmeldeordner:
:w ~/my_ed_script
Beenden Sie nun vi und verwenden Sie dieses ed-Skript, um die bearbeitete Datei abzurufen, die überhaupt nicht gespeichert werden konnte. So erreichen Sie das über die Bash-Eingabeaufforderung '$':
$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file
Diese Befehlssequenz verwendet Worte, um das mit diff generierte Skript zu verketten und gibt den Befehl ed write 'w' an die Standardeingabe von ed weiter. Anschließend wendet Ed dieses Skript auf die beschreibbare Kopie der Originaldatei an und schreibt die geänderten Pufferänderungen zurück in die Datei.
Auf diese Weise können Sie die in vi ausgeführten Arbeiten in einer Datei speichern, die ursprünglich jemand anderem gehört hatte, der vi, diff und ed verwendet.