Mogę wymyślić dwa sposoby, aby to zrobić.
Pierwszy sposób zakłada, że plik należy do Ciebie, ale plik jest ODCZYTOWY.
Wystarczy użyć sufiksu wykrzyknika vi w poleceniu write (: w!), Aby wymusić zastąpienie własnego pliku READONLY. Zakłada się oczywiście, że masz uprawnienia do pisania i wykonywania w bieżącym folderze.
:w!
spowoduje, że vi zastąpi oryginalny plik READONLY.
Drugi sposób zakłada, że ktoś jest właścicielem pliku i chcesz zapisać zmiany w tym pliku.
Jednym ze sposobów osiągnięcia tego jest zapisanie zmian dokonanych w oryginalnym pliku jako skryptu ed z poziomu vi. Ten skrypt ed można zastosować do oryginalnego pliku (lub innych podobnych plików) w późniejszym czasie poza vi za pomocą edytora linii ed.
Sposobem na zapisanie bieżącej sesji edycji jako skryptu ed jest przekazanie oryginalnej nazwy pliku i edytowanego bufora vi jako standardowego wejścia do narzędzia diff za pomocą przełącznika wiersza poleceń --ed, tj. Wyświetlanie różnic jako skryptu ed.
Zakładając edytowany bufor vi, wykonaj następujące czynności
:.,$!diff --ed [original_file] -
Zastępuje to wszystkie wiersze w bieżącym buforze (., $!) Skryptem ed wygenerowanym przez diff (diff --ed [oryginalny_plik] -) niezbędny do przekonwertowania oryginalnego pliku na zawartość bieżącego bufora. Następnie chcemy zapisać ten edytowany skrypt w bezpiecznym miejscu i zastosować skrypt do wersji oryginalnego pliku, do którego możemy zapisać. Tak więc zapisz skrypt w bezpiecznej lokalizacji, na przykład w folderze logowania:
:w ~/my_ed_script
Teraz zamknij vi i użyj tego skryptu ed, aby uzyskać edytowany plik, którego nie można zapisać w pierwszej kolejności. Oto jak to zrobić z wiersza poleceń bash „$”:
$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file
To, co ta sekwencja komend robi w słowach, to catenatowanie skryptu, który wygenerowaliśmy z diff, i echo komendy ed write, „w”, na standardowe wejście ed. Następnie Ed stosuje ten skrypt do zapisywalnej kopii oryginalnego pliku i zapisuje te zmodyfikowane zmiany bufora z powrotem do pliku.
Jest to więc sposób na zapisanie pracy wykonanej w vi do pliku, który pierwotnie był własnością innej osoby używającej vi, diff i ed.